我的类型或多或少看起来像:
struct validate_set
{
std::string_view key;
span<std::string_view> allowed_values;
};
最重要的是,我有这些的集合,然后可以将其传递给一个单独的函数,该函数将根据其允许的值验证一组key:value对。问题是我无法像这样构造这些数组:
constexpr std::array allowedValues{
validate_set{ "foo"sv, { "bar"sv, "baz"sv } },
validate_set{ "hello"sv, { "world"sv } }
};
由于我无法确定用于span
的类型。这个问题似乎很明显:阵列需要存储,而且似乎没有“内联”方法。 std::array
-或仅是普通数组-显然是不可能的,因为这会影响validate_set
的签名,并且会抑制创建这些结构的数组的能力。 std::initializer_list
也不起作用,因为那只是构造了一个临时文件。有没有我忽略或不知道的有趣技巧?
FWIW有两个不错的备份计划。
备份计划1
使用嵌套的空字符。例如:
constexpr std::array allowedValues{
validate_set{ "foo"sv, "bar\0baz"sv },
validate_set{ "hello"sv, "world"sv }
};
备份计划2
强制使用std::initializer_list
存储。例如:
constexpr std::initializer_list list0 = { "bar"sv, "baz"sv };
constexpr std::initializer_list list1 = { "world"sv };
constexpr std::array allowedValues{
validate_set{ "foo"sv, list0 },
validate_set{ "hello"sv, list1 }
};
选项1是当前的赢家,因为我真的更希望允许消费者内联声明。