Частичный вопрос специализации шаблона - PullRequest
2 голосов
/ 15 марта 2011
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 () методов со специализированной обработкой кода, специфичных для TYPEs , но то, что используется из CONFIG , будетсогласован во всех этих методах.

Проблема в том, что предыдущий код не компилируется вместе с несколькими различными комбинациями, и я был бы признателен за помощь в поиске другого решения или некоторого обходного путичтобы текущий работал.

Редактировать: я должен отметить, что предыдущий код работает без параметра шаблона CONFIG.

Ответы [ 2 ]

2 голосов
/ 16 марта 2011

Вам необходимо частично специализировать весь класс.Вы не можете специализировать отдельные функции-члены.

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_;
} 
0 голосов
/ 16 марта 2011

отправка

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_;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...