gpt4 book ai didi

c++ - 增强模板enable_if怎么样

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

一开始我用的是enable_if,我下面写的代码不会编译,但是逻辑上好像是对的,但是目前的enable_if实现不支持。

  1 
2 #include <iostream>
3 using namespace std;
4
5 template<int N>
6 struct S{
7 template<class T>
8 typename enable_if<N==1,T>::type
9 f(T t) {return 1;};
10
11 template<class T>
12 T
13 f(T t) {return 0;};
14 };
15
16 int main() {
17 S<1> s1;
18 S<2> s2;
19 cout << s1.f(99) <<" "<< s2.f(99) << endl;
20 return 0;
21 }

错误信息准确,问题指出准确。

enable_if.cc19:20: error: call of overloaded ‘f(int)’ is ambiguous
enable_if.cc:9:3: error: no type named ‘type’ in
‘struct std::enable_if<false, int>’

看来只是设计不明确的问题,很容易改正。为了处理它,我可以编写部分专用类模板:

#include <iostream>
using namespace std;

template<int N> struct S{
template<class T>
T
f(T t) {return 0;};
};
template<> struct S<1>{
template<class T>
T
f(T t) {return 1;};
};
int main() {
S<1> s1;
S<2> s2;
cout << s1.f(99) <<" "<< s2.f(99) << endl;
return 0;
}

但为了清洁和方便,如何增强 enable_if 模板以支持最初由错误代码催促的此类新功能?

  • s1调用f时,可以使用example中返回1的更特化的。
  • s2 调用f 时,将使用返回0 的一般方法,即使第一个失败。

最佳答案

您可以通过以下方式解决问题:

  1. 在您的函数模板上放置互斥的 SFINAE 约束;
  2. 强制在调用时执行 enable_if 的计算。

例如:

#include <type_traits>

template<int N>
struct S
{
template <class T>
typename std::enable_if<N == 1 && std::is_same<T, T>::value, int>::type
f(T t) {return 1;}

template <class T>
typename std::enable_if<N != 1, T>::type
f(T t) {return 0;}
};

这是一个live example .

关于c++ - 增强模板enable_if怎么样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17060865/

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