gpt4 book ai didi

c++11 - C++ - 可变参数模板部分特化

转载 作者:行者123 更新时间:2023-12-04 20:36:09 24 4
gpt4 key购买 nike

让我们有一个简单的片段:

template<class T, class... Args>
struct A {
void operator()() { std::cout << "A"; }
};

template<class T, class... Args>
struct A<T, double, Args...> {
void operator()() { std::cout << "B"; }
};

template<class T, class B, class... Args>
struct A<T, B, double, Args...> {
void operator()() { std::cout << "C"; }
};

我可以这样使用:
int main() {
A<int, int, int> a;
A<int, double, int> b;
A<int, int, double> c;
a(); b(); c();
return 0;
}

它正确返回 "ABC" .但是当我声明 A<int, double, double> d;我得到明显的编译时错误 ambiguous class template instantiation for struct A<int, double, double> .

问题是:我可以做一些技巧(可能使用 SFINAE)来考虑第二个模板参数,因为它具有更高的优先级并且会使用返回 B 的特化? (忽略第三个位置的类型 double)

注意:类型 doubleint用于使示例更简单,我将使用类型特征。因此,我想避免将特化作为解决方案:
template<class T, class... Args>
struct A<T, double, double, Args...> {
void operator()() { std::cout << "D"; }
};

最佳答案

正如您所建议的,您可以使用 SFINAE 不考虑 C如果第二个模板参数是 double 的特化:

template<typename, class T, class... Args>
struct A_impl {
void operator()() { std::cout << "A"; }
};

template<class T, class... Args>
struct A_impl<void, T, double, Args...> {
void operator()() { std::cout << "B"; }
};

template<class T, class B, class... Args>
struct A_impl<typename std::enable_if<!std::is_same<B,double>::value>::type,
T, B, double, Args...> {
void operator()() { std::cout << "C"; }
};

template<class T,class... Args>
using A = A_impl<void,T,Args...>;

关于c++11 - C++ - 可变参数模板部分特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35287702/

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