我想用" 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告诉没有操作符<<
谢谢你的帮助。
如果你只是想要cout
和std::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。