部分模板专业化问题

时间:2011-03-15 20:58:09

标签: c++ templates

class FooInterface {
  virtual void toggle() = 0;
};

template <class TYPE, class CONFIG>
class Foo : public FooInterface {
  virtual void toggle();

  TYPE value_;
};

template <>
void Foo<bool, class CONFIG>::toggle() {
  if (CONFIG::canToggle())
    value_ = !value_;
}

struct MyConfig {
  static bool canToggle() {
    return false;
  }
};

int main() {
  Foo<bool, MyConfig> foo;
}

这是我所处理的准确近似值。我基本上希望有一个专门的方法来处理 TYPE ,同时保持 CONFIG 通用。因此,例如,我可能有十几个不同的 Foo :: toggle()方法,其中专门的代码处理特定的 TYPE ,但是从 CONFIG 将在所有这些方法中保持一致。

问题是以前的代码没有编译,还有几个不同的组合,我很感激帮助找到一个不同的解决方案或一些解决方法来使当前的工作。

编辑:我应该注意前面的代码没有CONFIG模板参数。

2 个答案:

答案 0 :(得分:2)

你需要对整个班级进行部分专业化。您无法专门化各个成员函数。

template <class CONFIG>
class Foo<bool, CONFIG> : public FooInterface
{
   virtual void toggle();
   bool value_;
};  

template <class CONFIG>
inline void Foo<bool, CONFIG>::toggle()
{
   if (CONFIG::canToggle())
     value_ = !value_;
} 

答案 1 :(得分:0)

调度

template<class CONFIG, class C>
void toggle_impl(type<bool>, C &c) {
  if (CONFIG::canToggle())
    c.value_ = !c.value_;
}

template <class TYPE, class CONFIG>
class Foo : public FooInterface {
  virtual void toggle() {
      toggle_impl<CONFIG>(type<TYPE>(), *this);
  }
  TYPE value_;
};