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值;