C++从属常量
C++ subordinate constants
我有一组固定的域特定类别。每个类别都由可枚举类型的相关常数值(本身很有用)标识。此外,每个类别都有一组固定的子类别。每个子类别都要用一个相关的常数值来标识(也很有用),在这个类别中是唯一的,但在各个类别中不是唯一的。
我正试图找到一种方法来声明我的子类别的标识符,即"从属于"类别的标识符的标识符,也就是说,可以通过相关的类别标识符访问子类别标识符,并具有编译时分辨率。
在C++14中,实现这一点的合适方法是什么?
标识符只是可枚举类型的常数值(让它基于int)。
以下是我尝试过的:
enum Category
{
One = 1,
Two = 2,
Three = 3
};
template<Category categoryName> struct Subcategory;
template<> struct Subcategory<Category::One>
{
enum
{
A = 0,
B = 1
};
};
我们可以通过Subcategory<Category::One>::A
(不是刺激…)访问子类别标识符
这个表达式看起来太长了,我正试图找到一个解决方案,为访问a生成一个更简洁的表达式。沿着这条路径,最后的办法是使第一个枚举不命名。。。
实际上,正如pepper_chico所指出的,该表达式被简化为Subcategory<One>::A
。有没有一个解决方案(可能不是基于模板的)可以去掉标识符Subcategory
,只留下One
和A
?
这有点奇怪,但通过定义与类别相对应的对象,您可以为子类别名称启用语法One.A
(Live at Coliru):
#include <iostream>
#include <type_traits>
enum class Category
{
One = 1,
Two = 2,
Three = 3
};
template <Category> struct CategoryDescriptor;
#define DECLARE(name,...)
template <>
struct CategoryDescriptor<Category::name> {
enum sub_type { __VA_ARGS__ };
constexpr operator Category() const { return Category::name; }
};
constexpr CategoryDescriptor<Category::name> name{}
DECLARE(One, A, B);
DECLARE(Two, C, D);
DECLARE(Three, A, C, E);
#undef DECLARE
std::ostream& operator << (std::ostream& os, Category c) {
return os << static_cast<std::underlying_type<Category>::type>(c);
}
template <Category C>
using SubCategoryOf = typename CategoryDescriptor<C>::sub_type;
int main() {
std::cout << "One = " << One << "n"
"One.A = " << One.A << "n"
"Two = " << Two << "n"
"Two.D = " << Two.D << "n"
"Three = " << Three << "n"
"Three.A = " << Three.A << 'n';
// Category names convert to Category
auto foo = [](Category){};
foo(Three);
// Subcategory names convert to SubCategoryOf<Category>
auto bar = [](SubCategoryOf<Two>){};
bar(Two.C);
}
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- constexpr构造函数需要常量成员函数时出现问题