gpt4 book ai didi

基于动态选择类型的 C++ 模板用法

转载 作者:行者123 更新时间:2023-11-30 04:41:14 28 4
gpt4 key购买 nike

我试图找到一种有效的方法来调用基于特定 C++ 模板类型的变量动态值。目前我不清楚如何解决这个问题,除了使用大而丑陋的 if/else 选择器来处理大量排列,如下例所示。如您所见,这并不漂亮。

相反,我想动态调用合适的模板,而无需庞大的 if/else 选择器...

非常感谢来自 C++ 模板大师的任何建议。

// crude generic data converter template invoked based on dynamic in/out buffer type
template <class dstType, class srcType>
void ConvertCopy(unsigned char* dst, const unsigned char* src, int size)
{
// requires same in/out buffer same dimensions
if (typeid(srcType) != typeid(dstType))
{
dstType* c_dst = (dstType*)dst;
srcType* c_src = (srcType*)src;
for(int i=0;i<size;i++)
c_dst[i] = (dstType)c_src[i];
}
else
memcpy(dst, src, size * sizeof(srcType)); // Plain copy
}

void test()
{
const int buffersize = 100;

int inbuffer[buffersize];
double outbuffer[buffersize];
unsigned char* anyIn = (unsigned char*)inbuffer;
unsigned char* anyOut = (unsigned char*)outbuffer;

int my_in_type = 1;
int my_out_type = 3;

if(my_in_type == 1) { // int
if(my_out_type == 1) ConvertCopy<int, int>(anyOut, anyIn, buffersize); // int -> int
if(my_out_type == 2) ConvertCopy<float, int>(anyOut, anyIn, buffersize); // int -> float
if(my_out_type == 3) ConvertCopy<double, int>(anyOut, anyIn, buffersize); // int -> double
// ...
}
else if(my_in_type == 2) { // unsigned int
if(my_out_type == 1) ConvertCopy<int, unsigned int>(anyOut, anyIn, buffersize); // unsigned int -> int
if(my_out_type == 2) ConvertCopy<float, unsigned int>(anyOut, anyIn, buffersize); // unsignedint -> float
if(my_out_type == 3) ConvertCopy<double, unsigned int>(anyOut, anyIn, buffersize); // unsigned int -> double
// ...
}
else {}
// ...
}

最佳答案

没有办法(除了非常年轻的 JIT proposals )避免分支或查找表:功能模板的不同特化可以具有不相关类型(有一些限制在参数类型上,尤其是在支持推导时),这使得在类型系统中支持带有动态模板参数的调用变得难以置信,即使已知它是从一个小集合中提取的。 (您的所有碰巧都是 void(unsigned char*,const unsigned char*,int),但为了保持一致性,规则不考虑这一点。)

也就是说,样板文件可以在 cases like this高效表达类型不变的地方:

template<class D>
auto copier(int s) {
switch(s) {
case 1: return ConvertCopy<D,int>;
case 2: return ConvertCopy<D,unsigned>;
// …
}
}
void test() {
// …
[](int d) {
switch(d) {
case 1: return copier<int>;
case 2: return copier<float>;
case 3: return copier<double>;
// …
}
}(my_out_type)(my_in_type)(anyOut,anyIn,buffersize);
}

这种方法将冗长程度从 O(mn) 减少到 O(m+n) )。如果您认为额外的括号组是分开的,这可能会有所帮助,因为它们就像“运行时模板参数列表”。

当然可以将其概括为从具有(实用性)已知范围的有趣输入的元函数生成任何一致类型的值。

关于基于动态选择类型的 C++ 模板用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59167525/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com