Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在构造函数上启用\u_C++_Templates_Enable If - Fatal编程技术网

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的选项