gpt4 book ai didi

c++ - 如果存在专门化,如何限制模板函数?

转载 作者:搜寻专家 更新时间:2023-10-31 01:00:43 30 4
gpt4 key购买 nike

我正在编写一个库,可以使用 to_string() 将每个值类型转换为字符串免费功能。

我想启用 std::ostream& operator<<(std::ostream&, _)适用于所有类型 T为此 to_string(T)已验证。这是我的尝试:

namespace mylibrary {

// All my types are declared in the `mylibrary` namespace so that ADL is happy.

template <typename T>
inline std::string to_string(const T& value) {
// Return a string for value. Doesn't really matter how.
}

template <typename T>
inline std::ostream& operator<<(std::ostream& os, const T& value) {
return os << to_string(value);
}

}

这确实有效……但有点太好了:在解析 os << to_string(value) 时我的模板 operator<<()甚至被选为std::string的候选人遗憾的是,这使调用变得模棱两可,并以编译器错误告终。

我尝试使用 std::enable_if<>有条件地禁用我的 operator<<但遗憾的是我无法获得可以编译的东西。

如何限制我的 operator<<()对于 to_string(T) 的类型是一个有效的表达式吗?

或者,有没有办法限制我的 operator<<()对于在我的命名空间中定义的类型?

最佳答案

您可以使用表达式-SFINAE 来限制模板重载集。例如像这样:

#include <string>
#include <type_traits>

template <typename> using void_t = void;

template <typename T, typename = void_t<decltype(to_string(std::declval<T>()))>>
std::ostream& operator<<(std::ostream& os, const T& value) {
return os << to_string(value);
}

(您可能应该以某种方式将其包装起来,以免在您的公共(public)模板中出现可见的第二个模板参数;用户会发现并滥用它。)

关于c++ - 如果存在专门化,如何限制模板函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30407762/

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