char和初始化列表

时间:2010-09-15 16:46:24

标签: g++ c++11 variadic narrowing

我想通过初始化列表将一个数字字节值传递给数组。这可能吗?

template < int N > struct a {
  char s[N];
  template < typename ... A >
  a (A ... _a) : s {_a...} {}
};

int main () {
  // g++-4.5: error: narrowing conversion of »_a#0« from »int« to »char« inside { }
  a < 3 > x { 1, 2, 3 };
}

我能想到的是

  • 使用八进制表示,'\ 001'等,或
  • 投射每一个值。

但两者都不令人满意。

3 个答案:

答案 0 :(得分:1)

您不需要任何复杂的代码

template < int N > struct a {
  char s[N];
  template < typename ... A >
  a (A ... _a) : s {static_cast<char>(_a)...} {}
};

答案 1 :(得分:0)

您实际上并未使用初始化程序列表。构造函数收到variadic template,您使用uniform initialization初始化x

唯一的问题是我不知道使用initializer_list初始化数组的优雅方法,AFAIK std::array应该有一个接受initializer_list的构造函数,但它没有似乎得到了g ++的支持。

#include <utility>
template < int N > struct a {
    char s[N];

    a (std::initializer_list<char> list) {
        if (N != list.size()) 
            throw "list wrong size";

        int i = 0;
        const char* p = list.begin();
        while(p != list.end())
            s[i++] = *p++;
    }
};

答案 2 :(得分:0)

注意:除非您为类添加了功能,否则所有这些都是不必要的,因此它不再是聚合。 (例如,其他构造函数,私有成员,基类等)修复问题中代码的直接方法就是删除构造函数。所以,我们假设还有更多内容。

我看到有些人试图做这样的事情。看起来很丑陋,处理转换语义并试图人为地重新创建通常函数调用的功能。

这是一个创建数组类的策略,该数组类首先只有正确的构造函数。

模板别名可以通过隐藏::type丑陋而使锦上添花,但它还不在GCC中。

template< typename ... NT >
struct var_ctor_array {
    enum { size_e = 0 }; // only used for zero size case
};

template< typename T, typename ... NT >
struct var_ctor_array< T, NT ... > {
    enum { size_e = 1 + sizeof...( NT ) };

    T st[ size_e ];

    var_ctor_array( T elem0, NT ... elemN )
        : st { elem0, elemN ... } {}
};

template< typename T, size_t N, typename ... NT >
struct gen_var_ctor_array {
    typedef typename gen_var_ctor_array< T, N-1, T, NT ... >::type type;
};

template< typename T, typename ... NT >
struct gen_var_ctor_array< T, 0, NT ... > {
    typedef var_ctor_array< NT ... > type;
};

int main() { // usage
    gen_var_ctor_array< char, 5 >::type five( 1, 2, 3, 4, 5 );
}