我有一个班级:
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>
专业化派生的单独基类中从?
答案 0 :(得分:2)
模板的多个特化是不相关的类型。正如您在问题中提到的,一种常见的方法是将大多数功能移至基类以重用它。
对于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*) { ... }
}
};