gpt4 book ai didi

c++ - 检查模板参数类型是否被另一个函数接受的 static_assert

转载 作者:行者123 更新时间:2023-11-28 02:43:21 30 4
gpt4 key购买 nike

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

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

是否有一种类型特征可以自动做到这一点?你会怎么做?

最佳答案

为什么需要 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

关于c++ - 检查模板参数类型是否被另一个函数接受的 static_assert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25203271/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com