未知范围的常量表达式成员数组

时间:2018-07-21 07:30:18

标签: c++

我的类型或多或少看起来像:

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是当前的赢家,因为我真的更希望允许消费者内联声明。

0 个答案:

没有答案