我有一些遗留的C代码,并用C ++接口包装以供使用新的C ++代码。 C代码使用void *从文件加载数据。它知道根据要发送的enum标签在内部加载多少数据:
bool load_data( TAG_TYPE tag, void* data );
我的C ++包装器看起来像:
template<typename T>
T load( TAG_TYPE tag ) {
T data;
bool success = load_data( tag, &data );
assert( success );
return data;
}
这增加了一些类型安全性,并且对于C ++代码而言更干净。我们可以使用auto&const:
const auto foo = load<int>( TAG_NUM_POINTS );
现在,有人需要从文件中加载数组。他们想使用std :: array,因为这是C ++。
const auto foo = load<std::array<int, 3>>( TAG_RGB_VALUE );
这样安全吗?它似乎可以编译并运行良好。在幕后,它将传递&std::array<int, 3>
作为data
的值,而不是首选的data.data()
。
似乎这是我要进行模板专门化的区域,但是随后我需要为std :: array的类型和大小添加模板参数?那有可能吗?走这条路吗?
答案 0 :(得分:0)
std::array<>
中有一个称为data()
的方法。它使您可以访问内部数据,而不必担心实现。您可以在这里https://en.cppreference.com/w/cpp/container/array/data
一个例子
bool load_data( TAG_TYPE tag, void* data );
template<typename T>
std::array<T> load( TAG_TYPE tag ) {
std::array<T> data;
bool success = load_data( tag, data.data() );
assert( success );
return data;
}