一个只接受编译时已知表达式的函数
A function that accepts only compile time known expressions?
编译时表达式很好,因为您可以使用它们来专门化模板。例如,元组可以通过使用std::get
方法的编译时表达式来访问。
std::cout << std::get<0>(my_tuple) << std::endl;
现在,上面的表达非常丑陋。我正试图自己开发一些元组(希望能把它们变成编译时的字典(,这样,比如说,它们就公开了一种形式的方法:
my_dict.get<0>();
现在,我想做的是用一个[]运算符来代替它。我想知道这是否可能。首先,我不知道如何只选择常量、编译时已知的表达式作为运算符的参数。此外,返回类型将取决于常量表达式的值。
然而,有了定义,我可以用之类的东西更接近我想要的东西
#define item(x) get<x>()
这样我就可以使用
my_dict.item(0)
有没有比这更好的方法?
这种方法使用类型来传递索引,然后将其传递给operator[]
,后者提取索引。
template<std::size_t n>
using idx_t=std::integral_constant<std::size_t, n>;
template<std::size_t n>
idx_t<n> idx;
constexpr int square( int x ) { return x*x; }
constexpr int power( int base, size_t pow ) {
return (pow==0)?1:
(pow==1)?base:
(
square(power(base, pow/2))
*( (pow%2)?base:1 )
);
}
template<char... cs>
struct helper:idx_t<0>{};
template<char c0, char...cs>
struct helper<c0, cs...>:idx_t< (c0-'0') * power(10, sizeof...(cs)) + helper<cs...>{} > {};
template<char...cs>
constexpr idx_t< helper<cs...>{} > operator""_idx() { return {}; }
struct foo {
template<std::size_t n>
void operator[](idx_t<n>) const {
char arr[n];
std::cout << sizeof(arr) << 'n';
}
};
有3种(相当于语法糖(使用方法:
foo f;
f[idx_t<1>{}];
f[idx<2>];
f[3_idx];
f[1337_idx];
活生生的例子。对0xff_idx
等的支持只是一个练习。
相关文章:
- C++模板函数中的初始化 - 新的初始值设定项表达式列表被视为复合表达式
- 来自 DLL 的函数调用 [表观调用的括号前面的表达式必须具有(指向-)函数类型]
- 在函数中使用 const int size 参数创建数组会在 Visual Studio 中抛出错误 C++:表达式的计
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 函数返回的 rvalue 引用(表达式)是 xvalue - 但没有标识?
- 折叠表达式和函数名称查找
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 不是 lambda 函数中的常量表达式
- 保证逻辑 AND 表达式中的函数调用
- 函数调用在常量表达式中必须具有常量值
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 错误:表达式不能用作函数
- 使用表达式 SFINAE 的函数模板的类外定义
- std::cout 在打印变量与函数表达式时的行为不同
- 构造函数中缺少表达式
- 如何在使用模板的函数调用的大括号表达式中推导多维数组的大小
- C++98 中的常量表达式函数
- gcc 是否将非常量表达式函数的内置视为常量表达式
- 试图理解基本的正则表达式函数在c++
- 错误:','令牌之前的预期主表达式 //函数调用