我可以将&std :: array <>作为void *传递吗?

问题描述 投票:2回答:1

我有一些遗留的C代码,我用C ++接口包装,以便使用新的C ++代码。 C代码使用void *从文件加载数据。它根据您发送的枚举标记知道要在内部加载多少数据:

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的类型和大小添加模板参数?这是可能的,它是要走的路吗?

c++ c++11 templates std template-specialization
1个回答
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;
}
© www.soinside.com 2019 - 2024. All rights reserved.