我有一个定义如下的函数模板:
template <typename T>
Test &operator<<(const T &data)
{
std::cout << data << std::endl;
return *this;
}
如您所见,我使用data
打印到控制台std::cout
,其类型为std::ostream
。但是,T
可能不是由std::ostream::operator<<
处理的类型。
这就是为什么我要添加static_assert
来检查插入操作符是否接受T
的原因。目前,我必须检查std::ostream::operator<<
接受的每种类型:
template <typename T>
Test &operator<<(const T &data)
{
static_assert(std::is_arithmetic<T>::value ||
std::is_same<T, std::streambuf*>::value ||
...
std::is_same<T, std::string>::value, "data type must be compliant to std::ostream::operator<< accepted types");
std::cout << data << std::endl;
return *this;
}
是否有类型特征自动执行此操作?你会做什么?
答案 0 :(得分:2)
为什么要static_assert
?如果插入无效,可以简单地使函数不可调用吗?
template <typename T>
auto operator<<(const T &data) -> decltype(std::cout << data, std::declval<Test&>())
{
std::cout << data << std::endl;
...
}
如果您真的想要特质,请参阅is_stream_insertable