一个只接受编译时已知表达式的函数?

2024-04-08

编译时表达式很好,因为您可以使用它们来专门化模板。例如,可以通过使用带有以下内容的编译时表达式来访问元组std::get method.

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

活生生的例子 http://coliru.stacked-crooked.com/a/1bae3672a55c2dbf。支持0xff_idx等等留作练习。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一个只接受编译时已知表达式的函数? 的相关文章

随机推荐