小编Tom*_*ulz的帖子

在编译时查找数组中的重复项

我正在尝试学习一些更现代的C++实践,比如模板,我决定创建一个天真简单的命令行参数解析器,它主要在编译时工作,我已经constexpr遇到了问题,基本上我想做的就是检查对于编译时的重复条目(在运行时执行它是微不足道的).

首先,我有一个包含单个配置的结构:

struct Arg_Opt_Tuple {
  std::string_view mc{}; // multichar ie "help" 
  char sc{}; // singlechar ie 'h' 
  bool is_flag{}; 
};
Run Code Online (Sandbox Code Playgroud)

现在让我们说我想创建一个函数(或者最终是对象的构造函数),它返回一个固定大小的std :: array,但是在编译时也会检查重复项或空值,我的目标是让它调用一些与此类似的时尚:

constexpr auto ARG_COUNT = 4U;
constexpr auto opts = checked_arr<ARG_COUNT>(
  Arg_Opt_Tuple{"hello", 'h', false},
  Arg_Opt_Tuple{"world", 'g', true},
  Arg_Opt_Tuple{"goodbye", 'h', false}, // <- static_assert('h' == 'h')
  Arg_Opt_Tuple{"hello", 'r', false} // <- static_assert(sv.compare("hello") == 0)
);
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是使用std :: initializer_list但遇到了一些问题,在做了一些谷歌搜索结束后得出结论与constexpr一起做的不正确.我目前的尝试涉及一个可变参数模板:

template <std::size_t N, typename... T>
constexpr std::array<Arg_Opt_Tuple, N> checked_arr(T... list) {
  static_assert(N == sizeof...(T));
  return {list...};
}
Run Code Online (Sandbox Code Playgroud)

这可以工作,但对于只是初始化一个数组是完全多余的,我真的希望这是做一些编译时间检查.对于重复或错误的值在运行时很容易,你可以循环并比较或做std :: …

c++ variadic-templates constexpr c++11

5
推荐指数
1
解决办法
215
查看次数

标签 统计

c++ ×1

c++11 ×1

constexpr ×1

variadic-templates ×1