根据动态选择类型C++模板使用情况
C++ template usage based on selecting type dynamically
我正在尝试找到一种有效的方法来调用基于变量动态值的特定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 建议(避免分支或查找表:函数模板的不同专用化可以具有不相关的类型(对参数类型有一些限制,尤其是在支持推导时(,这使得在类型系统中支持具有动态模板参数的调用是不可信的,即使已知它是从一小组中提取的。 (你的都碰巧是void(unsigned char*,const unsigned char*,int)
,但为了保持一致性,规则不考虑这一点。
也就是说,样板可以在以下情况下有效地表达,其中类型不会发生变化:
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(。 如果您将额外的括号集视为单独的,因为它们类似于"运行时模板参数列表",这可能会有所帮助。
当然,可以对此进行推广,以从具有已知范围的有趣输入的元函数中生成任何一致类型的值。
MSVC编译为.NET
代码(过度简化(,这允许您使用其他Microsoft语言的元素。在Visual C++中,有一个称为"通用"的关键字,它的工作方式类似于模板,但可能允许你想要的内容。
Microsoft有几页关于此的文档,但这里是概述页面的链接。
相关文章:
- 如何在没有死锁和/或争用的情况下正确使用 std::mutex C++?
- 在集合的情况下使用emplace_hint的用例是什么?
- 在没有堆的情况下用两种方法构造对象
- 如何在不中断的情况下正确使用C++中的切换用例语句中的Fallthrough
- 给定一个填充无符号字符**的 C 函数,如何在没有中间副本的情况下用数据填充 std::vector
- 在这种情况下,有没有办法用单个解决方案替换两个仅在类型上不同的相似函数?
- 为什么在一种情况下,我会收到带有字符串文字的已弃用转换警告,而在另一种情况下却没有?
- 不能在没有对象的情况下调用成员函数,但我用对象调用函数
- 在不先显式调用析构函数的情况下,在旧对象上使用placement new是否危险
- 无法在前面有多余空格的情况下获取要打印的数组.只有第一个值会用空格打印
- 在可疑的情况下发出叮当警告:函数'foo'可以用属性"noreturn"声明吗?
- 如何在没有任何JavaScript知识的情况下用PNaCl编写C++HTML5应用程序
- 如何在不使用开关大小写的情况下用C++编写菜单驱动的程序
- 在什么情况下,运算符=应该用左值/右值重载而不是复制和交换来实现
- 在没有测试用例的情况下提升单元测试框架
- 在这种情况下,为函数赋值有什么用
- 如何在没有_setmode的情况下用C++输出unicode
- 如何在没有STL的情况下用c++中的Key创建和访问内存块
- 如何在不锁定文件的情况下用C++编写文件
- clang与gcc运行时的区别:用clang构建的c++类模板在没有复制构造函数的情况下崩溃,用复制构造函数构建的gcc