gpt4 book ai didi

c++ - SFINAE 无法有条件地编译成员函数模板

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

我正在尝试使用 std::enable_if 使用 SFINAE 和以下代码有条件地仅从两个成员函数模板中选择一个:

#include <iostream>
#include <type_traits>

template<typename T>
struct C {
template<typename Q = T, typename = typename std::enable_if<std::is_same<Q, int>::value>::type>
int foo() {
return 1;
}

template<typename Q = T, typename = typename std::enable_if<!std::is_same<Q, int>::value>::type>
int foo() {
return 0;
}

};

int main() {
std::cout << C<int>().foo() << std::endl; //error member function foo already defined
}

但出于某种原因,visual c++ 不断给我一个编译器错误,提示 foo 已定义。尽管如此,很明显,根据类的模板参数,只有一个函数是良构的。因此 SFINAE 应该将第二个排除在考虑范围之外。

知道为什么这不起作用吗?

最佳答案

尝试

template<typename T>
struct C {
template<typename Q = T,
typename std::enable_if<std::is_same<Q, int>::value, bool>::type = true>
int foo() { // .............................................^^^^^^^^^^^^^^^^^^^^
return 1;
}

template<typename Q = T,
typename std::enable_if<!std::is_same<Q, int>::value, bool>::type = true>
int foo() { // ..............................................^^^^^^^^^^^^^^^^^^^^
return 0;
}

};

要点是,在您的代码中,SFINAE 将启用/禁用模板类型参数的默认值;但默认值不参与重载决策,因此,在您的情况下,您有两个函数

template<typename, typename = void>
int foo() {
return 1;
}

template<typename, typename>
int foo() {
return 0;
}

具有相同的签名;因此编译器无法在两者之间进行选择,并且会报错。

我提出的代码是不同的,因为以防测试 std::enable_if是假的,你没有类型( = 左边的元素),而不是值。作为

// ................VVVVVV   what is = true ?
template<typename, = true>
int foo() {
return 1;
}

这是禁用该方法的真正“替换失败”。

关于c++ - SFINAE 无法有条件地编译成员函数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53806872/

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