static_assert,用于检查另一个函数是否接受模板参数类型

时间:2014-08-08 12:13:50

标签: c++ gcc c++11 static-assert

我有一个定义如下的函数模板:

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;
}

是否有类型特征自动执行此操作?你会做什么?

1 个答案:

答案 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