gpt4 book ai didi

c++ - 通过模板参数向类添加方法

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

我想在一个不使用 enable_if 的类中有一个模板参数特定的函数。它的名称保持不变,参数类型不同(尽管这应该不相关,因为只初始化了一个)。

enum class MyCases {
CASE1,
CASE2
};

template<enum MyCases case>
class MyClass
{
template<typename = typename std::enable_if<case == MyCases::CASE1>::type>
void myFunction(ParameterTypeA a) {
...
}

template<typename = typename std::enable_if<case == MyCases::CASE2>::type>
void myFunction(ParameterTypeB b) {
...
}
};

我现在收到一条错误消息,指出编译器想要用 CASE2 实例化第一个函数,用 CASE1 实例化第二个函数,尽管我认为替换失败不应导致错误 (SFINAE)。我究竟做错了什么?感谢您的帮助!

error: no type named ‘type’ in ‘struct std::enable_if<false, void>’

最佳答案

这是一个解决方案。向下滚动以查看我的思考过程。

#include <type_traits>
#include <iostream>

struct ParameterTypeA {};
struct ParameterTypeB {};

enum class MyCases {
CASE1,
CASE2
};

template<enum MyCases U>
class MyClass
{
public:
MyClass() { }
~MyClass() { }

template<enum MyCases T = U>
void myFunction(ParameterTypeA a, typename std::enable_if<T == MyCases::CASE1, void>::type* = nullptr) {
std::cout << "A" << std::endl;
}

template<enum MyCases T = U>
void myFunction(ParameterTypeB b, typename std::enable_if<T == MyCases::CASE2, void>::type* = nullptr) {
std::cout << "B" << std::endl;
}
};

int main() {
MyClass<MyCases::CASE1> m1;
m1.myFunction(ParameterTypeA{});
MyClass<MyCases::CASE2> m2;
m2.myFunction(ParameterTypeB{});
return 0;
}

输出:

A

B

Live Example


不加template在成员函数之前,你会得到一个 error: no type named 'type' in 'struct std::enable_if<false, void>'错误或类似的。为了理智,我把它归结为这个例子:

#include <type_traits>

template <typename U>
class Test {
template <typename T = U>
void myFunction(int b, typename std::enable_if<std::is_same<int, T>::value, void>::type* = nullptr) {
}

template <typename T = U>
void myFunction(int b, typename std::enable_if<!std::is_same<int, T>::value, void>::type* = nullptr) {
}
};

int main() {
Test<int> test;

return 0;
}

意识到这一点后,我修改了第一人称的答案,得到了这个。如您所见,没有 enum class在此版本中,但如果您更改 typename Utypename Tenum MyCases , 它就像魔术一样工作。

#include <type_traits>
#include <iostream>

struct ParameterTypeA {};
struct ParameterTypeB {};

template<typename U>
class MyClass
{
public:
MyClass() { }
~MyClass() { }

template<typename T = U>
void myFunction(ParameterTypeA a, typename std::enable_if<std::is_same<ParameterTypeA, T>::value, void>::type* = nullptr) {
std::cout << "A" << std::endl;
}

template<typename T = U>
void myFunction(ParameterTypeB b, typename std::enable_if<std::is_same<ParameterTypeB, T>::value, void>::type* = nullptr) {
std::cout << "B" << std::endl;
}
};

int main() {
MyClass<ParameterTypeA> m1;

m1.myFunction(ParameterTypeA{});

MyClass<ParameterTypeB> m2;

m2.myFunction(ParameterTypeB{});
return 0;
}

输出:

A

B

Live Example

关于c++ - 通过模板参数向类添加方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20289397/

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