C++ 在构造函数上启用\u
我有以下代码。我想在枚举类型上模板化类和类构造函数。但是,此代码不起作用?我怎样才能实现我想要的C++ 在构造函数上启用\u,c++,templates,enable-if,C++,Templates,Enable If,我有以下代码。我想在枚举类型上模板化类和类构造函数。但是,此代码不起作用?我怎样才能实现我想要的 #include < iostream > #include < type_traits > enum class MyType { Positive, Negative }; template < MyType T > struct B { int val = 0; template<typename U = T
#include < iostream >
#include < type_traits >
enum class MyType
{
Positive,
Negative
};
template < MyType T >
struct B {
int val = 0;
template<typename U = T>
B(int n, typename std::enable_if<U==MyType::Positive>::type* = 0) : val(n) { };
template<typename U = T>
B(int n, typename std::enable_if<U==MyType::Negative>::type* = 0) : val(-n) { };
};
int main() {
B<MyType::Positive> y(10);
B<MyType::Negative> n(10);
}
模板有一个typename参数,但您希望枚举作为参数。让我们解决这个问题:
#include <iostream>
#include <type_traits>
enum class MyType
{
Positive,
Negative
};
template <MyType T>
struct B {
int val = 0;
template<MyType U = T>
B(int n, typename std::enable_if<U==MyType::Positive>::type* = 0) : val(n) { };
template<MyType U = T>
B(int n, typename std::enable_if<U==MyType::Negative>::type* = 0) : val(-n) { };
};
int main() {
B<MyType::Positive> y(10);
B<MyType::Negative> n(10);
}
此外,还可以将SFINAE表达式放入模板参数中,以理顺构造函数参数:
template<MyType U = T, typename std::enable_if<U == MyType::Positive, int>::type = 0>
B(int n) : val(n) { };
template<MyType U = T, typename std::enable_if<U == MyType::Negative, int>::type = 0>
B(int n) : val(-n) { };
模板有一个typename参数,但您希望枚举作为参数。让我们解决这个问题:
#include <iostream>
#include <type_traits>
enum class MyType
{
Positive,
Negative
};
template <MyType T>
struct B {
int val = 0;
template<MyType U = T>
B(int n, typename std::enable_if<U==MyType::Positive>::type* = 0) : val(n) { };
template<MyType U = T>
B(int n, typename std::enable_if<U==MyType::Negative>::type* = 0) : val(-n) { };
};
int main() {
B<MyType::Positive> y(10);
B<MyType::Negative> n(10);
}
此外,还可以将SFINAE表达式放入模板参数中,以理顺构造函数参数:
template<MyType U = T, typename std::enable_if<U == MyType::Positive, int>::type = 0>
B(int n) : val(n) { };
template<MyType U = T, typename std::enable_if<U == MyType::Negative, int>::type = 0>
B(int n) : val(-n) { };
您的问题是T是一个非类型模板参数,因此您不能执行typename U=T,因为您希望类型模板参数U默认为T,这是MyType中的一个值
T这个名字选得很糟糕,这可能就是你当初犯这个错误的原因。通过MyType U=T更改typename U=T,您的代码将被编译。您的问题是T是一个非类型模板参数,因此您不能执行typename U=T,因为您希望类型模板参数U默认为T,这是MyType中的一个值
T这个名字选得很糟糕,这可能就是你当初犯这个错误的原因。通过MyType U=T更改typename U=T,您的代码将被编译。在C++20中,使用以下命令会更简单:
在C++20中,它甚至更简单,需要:
你的第一个问题是重复的。我已经删除了它,所以您的问题只是获取您正在运行的代码。您的第一个问题是的副本。我已经删除了它,所以你的问题只是关于如何运行你的代码。谢谢你的回答。如果要在结构定义之外定义构造函数,如何指定符号?我尝试了模板B::bintn:valn{};而且它在定义中是失败的,你不能设置默认值。删除=0的复选框以获得答案。如果要在结构定义之外定义构造函数,如何指定符号?我尝试了模板B::bintn:valn{};而且它在定义中是失败的,你不能设置默认值。删除=0的选项