我想通过初始化列表将一个数字字节值传递给数组。这可能吗?
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 };
}
我能想到的是
但两者都不令人满意。
答案 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 );
}