我还没有找到实现我想要的方法,但我没有足够的知识知道它是否不可能。帮助将不胜感激。
我们软件中的主要数据数据容器的行为有点像 std::variant 或 std::any:它有一个BaseContainer
提供类型枚举的基类。派生实例DataContainer
将实际数据保存在类型化张量成员变量中。所以一个简化的例子可以归结为这样的:
BaseContainer* vContainer = new DataContainer<float>({1000000});
if (vContainer->getType() == DataTypes::FLOAT)
const Tensor<float>& vTensor = dynamic_cast<DataContainer<float>>(vContainer)->getData();
我们有许多基于底层模板化类型和维度处理数据的方法:
template<typename T>
void processData(const tensor<T>& aTensor, ...other arguments...);
问题是,对于processData()
我们想用 a 调用的每个方法BaseContainer
,我们需要编写一个绑定方法来解开可能的类型以调用 的类型化版本processData()
:
void processData(BaseContainer* aContainer) {
switch (vContainer->getType()) {
case DataTypes::INT8:
return processData(dynamic_cast<DataContainer<int8_t>>(vContainer)->getData());
case DataTypes::UINT8:
return processData(dynamic_cast<DataContainer<uint8_t>>(vContainer)->getData());
case DataTypes::INT16:
return processData(dynamic_cast<DataContainer<int16_t>>(vContainer)->getData());
case DataTypes::UINT16:
return processData(dynamic_cast<DataContainer<uint16_t>>(vContainer)->getData());
...
default:
throw(std::runtime_error("Type not supported"));
}
}
我的问题是:是否可以制作一个单一的“适配器”方法(在任何已发布的 c++ 版本中),它可以采用函数(如processData()
)、BaseContainer 和可能的参数列表,并调用此函数的正确模板绑定与论点?
我未能动态绑定模板函数,因为我无法在没有模板类型的情况下传递名称。然而,模板类型需要基于 BaseContainer 是动态的。但也许还有其他方法可以实现我想做的事情?我对任何解决方案都非常好奇,主要也是为了扩展我的理解,只要解决方案的复杂度低于编写数百个适配器方法即可。
如果不出意外,是否可以使用预处理器宏生成“适配器”方法?