gpt4 book ai didi

c++ - 根据某个功能是否存在启用模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:33:47 24 4
gpt4 key购买 nike

我想设计一个自动提供 operator<<(std::ostream&, const T&) 的模板所有类(class)T为此 T::print_to(std::ostream&)存在并且可以被调用,这样我就可以将打印函数定义为成员函数(特别是利用虚拟调用)。

通过反复试验,我设法得出了这个结论:

template<typename T, typename = decltype(std::declval<T>().print_to(std::declval<std::ostream&>()))>
std::ostream &operator<<(std::ostream &s, const T &t) {
t.print_to(s);
return s;
}

它似乎有效,但由于我对 SFINAE 和这类技巧还很陌生,想知道是否有任何陷阱或可以改进。我在 https://ideone.com/uLJxac 放了一个小测试台.

如果可能,我想要一个 C++14 解决方案,因为我正在使用 C++14 代码库。但是,如果使用 C++17 允许更好的解决方案,那么我也对那个感兴趣。

最佳答案

在我看来,您在 operator<<() 中正确应用了 SFINAE ;我没有看到您的解决方案中存在缺陷。

我建议使用另一个版本(C++11 兼容,C++14 也兼容)只是因为需要更少的打字

template <typename T>
auto operator<< (std::ostream & s, T const & t)
-> decltype( t.print_to(s), s )
{
t.print_to(s);

return s;
}

关于c++ - 根据某个功能是否存在启用模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53022868/

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