У меня есть класс:
template<typename T>
class Foo
{
public:
...
Foo& operator=(const Foo&) { ... }
};
И я хотел бы специализироваться Foo<std::string>
добавить Foo<std::string>::operator=(const char*)
перегрузить и повторно использовать остальную часть Foo<T>
реализация. Возможно ли это для Foo<std::string>
специализация, чтобы использовать неспециализацию реализации, или я должен переместить Foo<T>
реализация в отдельный базовый класс, который Foo<T>
и Foo<std::string>
специализация проистекает из?
Несколько специализаций шаблона являются несвязанными типами. Как вы упомянули в этом вопросе, общий подход заключается в перемещении большей части функциональности в базовый класс для повторного использования.
Есть два предложения для C ++ 1x, которые позволили бы более чистый способ выражения намерения с помощью новой конструкции static if
Хотя оба предложения должны решить некоторые проблемы, прежде чем они будут приняты, и тогда вам придется подождать, пока стандарт не будет утвержден, а затем компиляторы наверстают упущенное … все равно, как упражнение для ума, предложенный синтаксис не будет использовать явная специализация, а точнее адаптировать общий шаблон:
template<typename T>
class Foo
{
public:
...
Foo& operator=(const Foo&) { ... }
static if (std::is_same<T,std::string>::value) {
Foo& operator=(const char*) { ... }
}
};
Других решений пока нет …