我有以下情况。
template <class T>
class Foo {
template <class V>
int bar();
};
(我正在使用swig将此类移植到python,以澄清)
我遇到的问题是因为实际的模板参数T和V是相关的,Foo<T1>
应该有bar<V1>
,Foo<T2>
应该有bar<V2>
,依此类推。但是,我处于swig(或C ++编译器)假装定义了所有可能组合的情况,即Foo<T1>::bar<V1>
,Foo<T1>::bar<V2>
,Foo<T2>::bar<V1>
等等。这意味着我必须提供Tn * Vn方法,除了对角线组合Ti / Vi
有没有办法以聪明的方式防止这种情况,或者我应该只是咬住灰尘并实施所有组合?如果您认为我有设计问题,您会如何解决?
答案 0 :(得分:4)
如果T
和V
之间存在1-1映射,为什么bar
需要成为模板?您可以创建一个特质类来确定正确的V
,如下所示:
template <typename T>
struct Match_T_V;
template <>
struct Match_T_V<T1> {
typedef V1 type;
};
template <>
struct Match_T_V<T2> {
typedef V2 type;
};
//etc. for other Ts
template <typename T>
class Foo {
typedef typename Match_T_V<T>::type V;
int bar(); //use V, guaranteed to be the correct one
};