C++模板参数仅限于类(非基本类型)
是否可以指定一个永远不会与基本类型(例如 int)匹配的模板参数?我正在大力对抗歧义。例如:
template<class T> void Function(const T& x) { SetString(x.GetString()); };
只有当 T 中有 GetString 方法时才有效,但是如果编译器看到这个函数,它会尝试使用它,即使 T 只是 int 。
Is it possible specify a template argument, that would never match to a basic type, such as an int? I'm heavily fighting ambiguities. So for example:
template<class T> void Function(const T& x) { SetString(x.GetString()); };
That would work only if there's a method GetString in T, but if the compiler sees this function, it tries to uses it even if T is just int for example.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
方法一
可以使用
std::enable_if
,如下所示:C++11
Demo
C++17
Demo
方法2
我们可以利用SFINAE。这里我们使用
decltype
和逗号运算符来定义函数模板的返回类型。演示
这里我们使用尾随返回类型语法来指定函数模板。
Method 1
You can use
std::enable_if
as shown below:C++11
Demo
C++17
Demo
Method 2
We can make use of SFINAE. Here we use
decltype
and the comma operator to define the return type of the function template.Demo
Here we've used trailing return type syntax to specify the return type of the function template.
如果问题是
int
不支持GetString()
方法,也许您可以启用它,而不是禁用基本类型的函数(且仅当)模板类型有一个GetString() const
方法,接受不带参数的调用。请注意,
GetString()
必须为const
,因为Function()
接收const
引用,因此您可以调用仅当GetString()
是const
方法时,Function()
内的GetString()
才有效。下面是一个完整的编译示例。观察
bar1
和bar2
情况下的失败If the problem i that
int
doesn't support aGetString()
method, maybe instead of disable the function for fundamental types, you could enable it if (and only if) the template type has aGetString() const
method accepting a call without arguments.Observe that
GetString()
must beconst
, becauseFunction()
receive aconst
reference, so you can callGetString()
insideFunction()
only ifGetString()
is aconst
method.The following is a full compiling example. Observe the failure in the
bar1
andbar2
cases