用于初始化带有数组和lambda

时间:2017-10-31 21:55:00

标签: c++11

我有一个应该静态初始化的结构。

struct Option
{ char Option[8];
  void (*Handler)(const char* value);
};

void ParseInto(const char* value, const char** target); // string option
void ParseInto(const char* value, int* target, int min, int max); // int option

static int count = 1;
static const char* name;

static const Option OptionMap[] =
{ { "count", [](const char* value) { ParseInto(value, &count, 1, 100); } }
, { "name",  [](const char* value) { ParseInto(value, &name); } }
  // ...
};

到目前为止,它确实有效。

为了摆脱一遍又一遍地重复lambda函数定义(有几十个)我想使用这样的工厂:

struct Option
{ const char Option[8];
  const void (*Handler)(const char* value);
  template<typename ...A>
  Option(const char (&option)[8], A... args)
  : Option(option)
  , Handler([args...](const char* value) { ParseInto(value, args...); })
  {}
};

static const Option OptionMap[] =
{ { "count", &count, 1, 100 }
, { "name",  &name }
};

这不起作用有两个原因:

  1. 我没有找到第一个构造函数参数option的类型,它完美地转发了字符数组的初始化。困难的部分是指定数组的长度通常与数组长度不匹配。
  2. 更难的部分是lambda函数有一个闭包,因此不能衰减到函数指针。但所有参数都是编译时常量。所以应该可以创建构造函数constexpr。但是,lambdas似乎根本不支持constexpr
  3. 任何人都知道如何解决这一挑战?

    当前的解决方案是可变宏。不是那么漂亮,但当然,它有效。

    Context是C ++ 11。我现在不想升级,但是仍然可以使用更新标准的解决方案。这样的问题往往会不时出现。

    底层(旧)代码还有一些进一步的限制。 struct Option必须是POD类型,第一个成员必须是字符数组,因此从Option*const char*的强制转换有效。

0 个答案:

没有答案