【发布时间】:2022-03-02 03:14:21
【问题描述】:
是否可以指定一个模板参数,它永远不会匹配基本类型,例如 int?我正在与歧义作斗争。比如:
template<class T> void Function(const T& x) { SetString(x.GetString()); };
这只有在 T 中有 GetString 方法时才有效,但如果编译器看到这个函数,它会尝试使用它,即使 T 只是 int。
【问题讨论】:
-
我认为
std::enable_if是您正在寻找的。span> -
如果有人试图写
Function(35);,你想发生什么?在int案例中,您还想让它做什么? -
std::enable_if与std::is_fundamental或std::is_arithmetic结合使用 -
不幸的是,C++20 不是一个选项。概念将通过
{ t.GetString() } -> std::convertable_to<std::string>的要求非常简单地解决这个问题 -
也许,当且仅当
x具有GetString()方法时,您可以启用它,而不是禁用基本类型的功能。应该够了template <typename T> auto Function (T const & x) -> decltype( x.GetString(), void()) { SetString(x.GetString()); };
标签: c++ templates c++17 sfinae