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

A function that accepts only compile time known expressions?

本文关键字:表达式 函数 编译 一个      更新时间:2023-10-16

编译时表达式很好,因为您可以使用它们来专门化模板。例如,元组可以通过使用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等的支持只是一个练习。