C++ 动态分派的部分模板专门化
我正在尝试为基于整数值(而不是类型)模板的函数编写动态调度程序。虽然我可以编写代码生成器或使用大型宏链来创建dispatcher源代码,但模板化解决方案似乎更为优雅 我已经将我的调度程序简化为一个简单的表单(实际上不做任何调度):C++ 动态分派的部分模板专门化,c++,templates,partial-specialization,C++,Templates,Partial Specialization,我正在尝试为基于整数值(而不是类型)模板的函数编写动态调度程序。虽然我可以编写代码生成器或使用大型宏链来创建dispatcher源代码,但模板化解决方案似乎更为优雅 我已经将我的调度程序简化为一个简单的表单(实际上不做任何调度): //使用完全模板专门化可以很好地工作 模板 结构TestDispatcher1D{ int f(int n){ if(n==n)返回n;//用实际分派替换me 测试调度员1D t; 返回t.f(n); } }; 模板 结构TestDispatcher1D{ int f
//使用完全模板专门化可以很好地工作
模板
结构TestDispatcher1D{
int f(int n){
if(n==n)返回n;//用实际分派替换me
测试调度员1D t;
返回t.f(n);
}
};
模板
结构TestDispatcher1D{
int f(int n){return-1;}
};
//部分模板专门化是有问题的
模板
结构TestDispatcher2D{
int f(int m,int n);
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
结构TestDispatcher2D{
intf(intm,intn){return-1;}
};
模板
int TestDispatcher2D::f(int m,int n){
if((n==n)&&(m==m))返回n+m;//用实际分派替换我
if(m
在gcc 4.1.1上编译时,出现以下错误:
t.cpp: In member function 'int TestDispatcher2D::f(int, int) [with int M = 16, int N = 16]':
t.cpp:63: instantiated from here
t.cpp:40: error: no match for call to '(TestDispatcher2D) (int&, int&)'
t.cpp:63: instantiated from here
t.cpp:43: error: no match for call to '(TestDispatcher2D) (int&, int&)'
t.cpp:63: instantiated from here
t.cpp:47: error: no match for call to '(TestDispatcher2D) (int&, int&)'
t、 cpp:在成员函数“int TestDispatcher2D::f(int,int)[其中int M=16,int N=16]中]:
t、 cpp:63:从此处实例化
t、 cpp:40:错误:调用'(TestDispatcher2D)(int&,int&)不匹配
t、 cpp:63:从此处实例化
t、 cpp:43:错误:对“(TestDispatcher2D)(int&,int&)的调用不匹配
t、 cpp:63:从此处实例化
t、 cpp:47:错误:对“(TestDispatcher2D)(int&,int&)的调用不匹配
显然,当我尝试创建递归对象时,编译器并没有将其视为实例化新模板的请求
有什么建议吗?您只是在递归调用中没有调用
f()
函数,而是试图“调用对象”:
你写道:
TestDispatcher2D<...> t;
return t(m,n);
testdispatcher2dt;
返回t(m,n);
但是你想要:
TestDispatcher2D<...> t;
return t.f(m,n);
testdispatcher2dt;
返回t.f(m,n);
您还可以编写TestDispatcher2D().f(mn,n)就是这样。谢谢我之前试着使用一些操作符()技巧,但没有解决这个问题。你甚至可以使f为static,所以你根本不需要构造一个临时对象。
TestDispatcher2D<...> t;
return t.f(m,n);