如何基于类型相关类型专门化C ++模板类函数?

时间:2013-09-17 08:31:46

标签: c++ templates g++ template-specialization

我有一个C ++模板类

// Definition
template <typename T>
class MyCLass {
public:
  typedef typename T::S MyS; // <-- This is a dependent type from the template one
  MyS operator()(const MyS& x);
};

// Implementation
template <typename T>
MyCLass<T>::MyS MyClass<T>::operator()(const MyClass<T>::MyS& x) {...}

我想要的是,当operator()MyS时,重载的运算符double的行为会有所不同。

我考虑过专业化,但考虑到专业化应该依赖于类型依赖类型,在这种情况下如何做?三江源

2 个答案:

答案 0 :(得分:3)

您可以将工作转发给某个私有的重载函数:

template <typename T>
class MyCLass {
public:
  typedef typename T::S MyS;
  MyS operator()(const MyS& x) { return operator_impl(x); }

private:
  template<typename U>
  U operator_impl(const U& x);

  double operator_impl(double x);
};

答案 1 :(得分:3)

您可以通过引入额外的默认参数来解决此问题:

template <typename T, typename Usual = typename T::S>
class MyClass { ... };

然后您可以使用double

进行专业化
template <typename T>
class MyClass<T, double> { ... }