Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.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

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++ 其他类型中的非类型模板参数别名_C++_Templates - Fatal编程技术网

C++ 其他类型中的非类型模板参数别名

C++ 其他类型中的非类型模板参数别名,c++,templates,C++,Templates,我试图用模板参数定义一个通用容器。模板参数有预定义的值可供选择。为了方便起见,我还允许传递整数值作为替代,并将它们自动映射到相应的预定义值 例如(这不起作用): struct选项{ 选项(无符号整数); }; 静态方案A(1); 静态方案B(2); 模板 类值{}; b值; 值c;//1,uint32\u t->2)没有安全或标准的方法来获得所需的效果,如果你达到了这样一个程度,这看起来是一个可行的选择,我强烈建议重新考虑你的设计。但是,如果您坚持,您有一个c++17编译器,并且您愿意使用指针而

我试图用模板参数定义一个通用容器。模板参数有预定义的值可供选择。为了方便起见,我还允许传递整数值作为替代,并将它们自动映射到相应的预定义值

例如(这不起作用):

struct选项{
选项(无符号整数);
};
静态方案A(1);
静态方案B(2);
模板
类值{};
b值;

值c;//1,uint32\u t->2)

没有安全或标准的方法来获得所需的效果,如果你达到了这样一个程度,这看起来是一个可行的选择,我强烈建议重新考虑你的设计。但是,如果您坚持,您有一个c++17编译器,并且您愿意使用指针而不是引用,那么您可以使用非类型模板参数推断,与SFINAE一起使用,以获得所需的效果:

#include<type_traits>

struct Option{
    Option(unsigned int);
}

static Option A(1);
static Option A(2);

//enable this template if the non-type template parameter is a pointer-to-Option, 
//    or an unsigned int can be constructed from the parameter
template<auto I, typename=std::enable_if_t<
                          std::is_same_v<decltype(I), Option*> ||
                          std::is_constructible_v<uint, decltype(I)>
                                          >>
class Value{

};

Value<&B> b;
Value<2> c; 

#包括
结构选项{
选项(无符号整数);
}
静态方案A(1);
静态方案A(2);
//如果非类型模板参数是指向选项的指针,则启用此模板,
//或者可以从参数构造无符号int
模板>
阶级价值{
};
b值;
c值;
这将起作用,添加对更多类型的支持是相当直接的。但是,使用模板参数并非易事,需要一个取决于您计划如何使用模板参数的解决方案

基于上面的代码,我将考虑使用EnUM类,这可能提供一个更合适的替代方案:

enum class Option{
    A=1,B=2
};

template<Option o>
class Value{
};

Value<Option::B> b;
Value<static_cast<Option>(2)> c; 
enum类选项{
A=1,B=2
};
模板
阶级价值{
};
b值;
c值;

没有安全或标准的方法来获得所需的效果,如果您达到了这样的程度,这看起来是一个可行的选择,我强烈建议重新考虑您的设计。但是,如果您坚持,您有一个c++17编译器,并且您愿意使用指针而不是引用,那么您可以使用非类型模板参数推断,与SFINAE一起使用,以获得所需的效果:

#include<type_traits>

struct Option{
    Option(unsigned int);
}

static Option A(1);
static Option A(2);

//enable this template if the non-type template parameter is a pointer-to-Option, 
//    or an unsigned int can be constructed from the parameter
template<auto I, typename=std::enable_if_t<
                          std::is_same_v<decltype(I), Option*> ||
                          std::is_constructible_v<uint, decltype(I)>
                                          >>
class Value{

};

Value<&B> b;
Value<2> c; 

#包括
结构选项{
选项(无符号整数);
}
静态方案A(1);
静态方案A(2);
//如果非类型模板参数是指向选项的指针,则启用此模板,
//或者可以从参数构造无符号int
模板>
阶级价值{
};
b值;
c值;
这将起作用,添加对更多类型的支持是相当直接的。但是,使用模板参数并非易事,需要一个取决于您计划如何使用模板参数的解决方案

基于上面的代码,我将考虑使用EnUM类,这可能提供一个更合适的替代方案:

enum class Option{
    A=1,B=2
};

template<Option o>
class Value{
};

Value<Option::B> b;
Value<static_cast<Option>(2)> c; 
enum类选项{
A=1,B=2
};
模板
阶级价值{
};
b值;
c值;