我有一个应该静态初始化的结构。
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 }
};
这不起作用有两个原因:
option
的类型,它完美地转发了字符数组的初始化。困难的部分是指定数组的长度通常与数组长度不匹配。constexpr
。但是,lambdas似乎根本不支持constexpr
。任何人都知道如何解决这一挑战?
当前的解决方案是可变宏。不是那么漂亮,但当然,它有效。
Context是C ++ 11。我现在不想升级,但是仍然可以使用更新标准的解决方案。这样的问题往往会不时出现。
底层(旧)代码还有一些进一步的限制。 struct Option
必须是POD类型,第一个成员必须是字符数组,因此从Option*
到const char*
的强制转换有效。