类和方法上的模板是相关的。如何防止组合?

时间:2013-05-01 08:10:28

标签: c++ templates swig

我有以下情况。

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

之外,大多数方法都会引发异常

有没有办法以聪明的方式防止这种情况,或者我应该只是咬住灰尘并实施所有组合?如果您认为我有设计问题,您会如何解决?

1 个答案:

答案 0 :(得分:4)

如果TV之间存在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
};