我有一个函数模板定义如下:
mẫu
Test &operator<<(const T &data)
{
std::cout << data << std::endl;
trả lại *cái này;
}
如您所见,我向控制台打印了 dữ liệu
sử dụng std::cout
, 类型是 std::ostream
.然而,T
可能不是 std::ostream::operator<<
处理的类型.
这就是为什么我想添加 static_assert
检查是否T
是否被插入运算符接受。目前,我必须检查 std::ostream::operator<<
的每种类型接受:
mẫu
Test &operator<<(const T &data)
{
static_assert(std::is_arithmetic::value ||
std::is_same::value ||
...
std::is_same::value, "data type must be compliant to std::ostream::operator<< accepted types");
std::cout << data << std::endl;
trả lại *cái này;
}
是否有一种类型特征可以自动做到这一点?你会怎么做?
为什么需要 static_assert
?如果插入无效,是否可以简单地使函数不可调用?
mẫu
auto operator<<(const T &data) -> decltype(std::cout << data, std::declval())
{
std::cout << data << std::endl;
...
}
如果您真的想要一个特征,请参阅 is_stream_insertable
Tôi là một lập trình viên xuất sắc, rất giỏi!