在我的班上,我有以下声明:
class OCLState {
//Irrelevant stuff involving OpenCL contexts and command queues and so on...
const cl_int16 values;
OCLState(const std::array<int, 16> & _values);
}
当然,我需要在创建此对象时初始化向量。问题是,如何将_values
翻译成values
将作为初始化程序接受的表单?
OCLState::OCLState(const std::array<int, 16> & _values) : values(
{ _values[0], _values[1], _values[2], _values[3] , _values[4] , _values[5] , _values[6], _values[7],
_values[8], _values[9], _values[10], _values[11] , _values[12] , _values[13] , _values[14], _values[15] }
) {
//Irrelevant stuff involving setting up contexts and queues and so forth
}
这样可行,但它非常麻烦且难以阅读。还有更好的方法吗?
编辑:
OCLState::OCLState(const std::array<int, 16> & _values) : values(array_to_vector(_values)) {
}
cl_int16 OCLState::array_to_vector(const std::array<int, 16> & in) {
cl_int16 out;
for (int i = 0; i < 16; i++) out.s[i] = in[i];
return out;
}
这也有效,但我认为这是不理想的。我正在寻找一种不会为编写这些程序时可能使用的每个矢量编写辅助方法的方法。
答案 0 :(得分:1)
解决这个问题而不放弃常规的一种方法是使用喜欢/讨厌的reinterpret_cast
。您可以按如下方式定义构造函数:
OCLState::OCLState(const std::array<int, 16> &_values) :
values(*reinterpret_cast<const cl_int16*>(&_values.front())) { }
产生所需的行为:
int main(int argc, char *argv[]) {
OCLState S({0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15});
std::cout << S.values.s[0] << "," << S.values.s[15] << std::endl;
}
打印&gt; 0,15
答案 1 :(得分:0)
use可以在构造函数体
中使用std :: copy(include&lt; algorithm&gt;)std::copy ( _values.begin(),_values.end(), &values.s[0]);
你必须从值中删除const
或者将此代码包装在类似于辅助函数的模板函数中