-1

我有一个代表一个值的类,并且可以假定单个数字、单个字符串、值数组或键值对映射的值。

这是当前的定义:

class Foo {
public:
    typedef enum { STRING, NUMBER, ARRAY, MAP } data_type;
    struct str_less {
        bool operator()(const char *a, const char *b) const {
            return strcmp(a,b)<0;
        }
    };
    inline Foo(int n):type(NUMBER),number_value(n) { }
    inline Foo(double n):type(NUMBER),number_value(n) { }
    inline Foo(const char *s):type(STRING),string_value(s) { }
    inline Foo(const std::initializer_list<std::pair<const char *const,Foo>> &arg):type(MAP),map_value(arg) { }    
    template<size_t N> inline Foo(const Foo (&arg)[N]):type(ARRAY) { std::copy(&arg[0], &arg[N], std::back_inserter(arg)); }
    inline Foo(const std::vector<Foo> &arg):type(ARRAY),array_value(arg) { }
private:
  data_type type;
  double number_value = 0;
  const char *string_value = "";
  std::vector<Foo> array_value;
  std::map<const char *,Foo, str_less> map_value;
};

我只对从编译时给出的值实例化这个类感兴趣......出于我的目的,它永远不会在运行时以变量作为参数来调用。

由于 中的构造函数Foo,在编译时指定的任何文字值都会自动类型转换为 a Foo,然后我可以以几乎类似于 json 的方式指定文字,例如:

Foo({
    {"number_key", 100},
    {"array_key", std::vector<Foo>
        {1, 3, 4,
            {
                {"inner_key", "value"},
                {"second_key", 500}}, "abc"}}});

但是,如您所见,需要注意的是,我似乎需要显式转换为 std::vector 以支持数组类型。在 C++11 中有什么方法可以将某种类型的文字数组传递给函数,以便我可以 template<size_t N> Foo::Foo(const Foo (&arg)[N])适当地调用?我非常喜欢这个,因为要求显式向量转换感觉很尴尬,而且与自动转换其类型的其他构造函数绝对不是同质的。我想知道是否有任何其他方式可以利用智能自动类型转换以更统一和简洁的方式进行?

我以前见过这样的代码:

template<std::size_t N> void do_stuff(const char (&str)[N]) ...

可以用字符串文字调用哪个,因此从概念上讲,似乎存在理解编译时文字数组的机制,但是有没有办法指定除 之外的类型的常量数组char

4

1 回答 1

1

像这样的东西应该工作:

template <typename... Args>
Foo(Args&&... args) :
  array_value{Foo(std::forward<Args>(args))...}
{}

Foo foo(4.2, "hello");

概念证明

于 2017-06-27T01:06:02.640 回答