采取以下措施,
template<class T>
struct Foo {
Foo(){}
// a template constructor "generalized" over related types
template<class U>
Foo(Foo<U> const&) {
std::cout << 1;
}
// copy constructor
Foo(Foo const&) {
std::cout << 2;
}
};
及其用户:
void main() {
Foo<int> f1;
Foo<const int> f2(f1); // prints 1
Foo<const int> f3(f2); // prints 2
}
即使没有显式复制构造函数,编译器也会生成一个并将其用于f3(f2)
。
有没有办法强制模板重载?例如,复制构造函数可以是SFINAE吗?这是为了避免代码重复,有趣的是,似乎并不是一种使用委托构造函数的方法(从复制构造函数委托给模板一个)。
答案 0 :(得分:5)
构造函数模板永远不能是复制构造函数,因此如果您没有定义构造函数,编译器将隐式地为您执行此操作,因为您已经发现了。
避免代码重复的一种解决方法是定义第三个构造函数,并从上面显示的两个构造函数委托给它。
template<class T>
struct Foo {
Foo(){}
struct tag{};
// a template constructor "generalized" over related types
template<class U>
Foo(Foo<U> const& f)
: Foo(tag{}, f)
{
std::cout << 1 << '\n';
}
// copy constructor
Foo(Foo const& f)
: Foo(tag{}, f)
{
std::cout << 2 << '\n';
}
private:
template<class U>
Foo(tag, Foo<U> const&)
{
std::cout << 3 << '\n';
}
};