如何使用特征来知道一个类型是否可以与cout一起使用



我想用" traits"为了编写一个打印列表所有值的函数,

template<typename T>
void print(std::list<T> l) 
{ 
for (auto item : l)
cout << item; cout << endl; 
};

我也试过:

对不起,我的问题不太清楚,因为我刚开始介绍一些新的c++特性。我试过这样写:

template<class T>
enable_if_t<is_convertible_v<T,std::string>> print(std::list<T> l) 
{
for (auto item : l) std::cout << item << endl; 
};

但不工作,visual studio告诉没有操作符<<

谢谢你的帮助。

如果你只是想要coutstd::list<T>,你不需要性状。只写

template<typename T> void print(std::list<T> const& list) {
for (auto&& t: list) std::cout << t;
}

和编译器将产生一个错误,如果有任何不工作。

只要上述解决方案足够,就不要进行以下操作

如果你想基于"可打印性"来构建编译时逻辑。T(类似于sfina),只需使用c++ 20的概念:

template<typename T> concept Ostreamable = requires(T t) { std::cout << t; };
template<Ostreamable T> void print(std::list<T> const& list) {
for (auto&& t: list) std::cout << t;
}

如果你没有c++ 20,你可以用老方法破解:

template<typename T, typename = void> auto constexpr ostreamable_v = false;
template<typename T> auto constexpr ostreamable_v<
T, std::void_t<decltype(std::cout << std::declval<T>())>
> = true;
template<typename T> std::enable_if_t<ostreamable_v<T>> print(std::list<T> const& list) {
for (auto&& t: list) std::cout << t;
}

c++ 20之前的一般想法是故意破坏与谓词不匹配的优先级更高的签名,参见SFINAE。

相关内容

  • 没有找到相关文章

最新更新