2009-02-18 65 views
2

我正在尝试为模板化为整数值(不是类型)的函数编写动态分派器。虽然我可以编写代码生成器或使用大型宏链来创建调度程序源,但似乎模板化解决方案会更加优雅。动态分派的部分模板专业化

我我的调度员剥离下来,以一个简单的形式(这实际上并没有做任何分派):

// works fine with full template specialization 
template <int N> 
struct TestDispatcher1D { 
    int f(int n) { 
    if (n == N) return n; // replace me with actual dispatch 
    TestDispatcher1D<N-1> t; 
    return t.f(n); 
    } 
}; 

template<> 
struct TestDispatcher1D<-1> { 
    int f(int n) { return -1; } 
}; 

// partial template specialization is problematic 
template <int M, int N> 
struct TestDispatcher2D { 
    int f(int m, int n); 
}; 

template<int M> 
struct TestDispatcher2D<M,-1> { 
    int f(int m, int n) { return -1; } 
}; 

template<int N> 
struct TestDispatcher2D<-1,N> { 
    int f(int m, int n) { return -1; } 
}; 

template<> 
struct TestDispatcher2D<-1,-1> { 
    int f(int m, int n) { return -1; } 
}; 

template <int M, int N> 
int TestDispatcher2D<M,N>::f(int m, int n) { 
    if ((n == N) && (m == M)) return n + m; // replace me with actual dispatch 
    if (m < M) { 
    if (n < N) { 
     TestDispatcher2D<M-1,N-1> t; 
     return t(m,n); 
    } else { 
     TestDispatcher2D<M-1,N> t; 
     return t(m,n); 
    } 
    } else { 
    TestDispatcher2D<M,N-1> t; 
    return t(m,n); 
    } 
} 

// test code 
void testIt() { 
    { 
    TestDispatcher1D<16> t; 
    t.f(16); 
    } 
    { 
    TestDispatcher1D<16>t; 
    t.f(0); 
    } 
    { 
    TestDispatcher2D<16,16>t; 
    t.f(8,8); 
    } 
} 

当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&)' 

很显然,当我尝试创建递归对象时,编译器不会将其视为实例化新模板的请求。

有什么建议吗?

回答

1

你根本就没有叫你的递归调用的f()功能,你想“调用对象”:

你写:

TestDispatcher2D<...> t; 
return t(m,n); 

但是你想:

TestDispatcher2D<...> t; 
return t.f(m,n); 
+0

您也可以编写TestDispatcher2D <...>().f(mn,n) – 2009-02-18 16:16:53