C++03:使用模板构造函数时保留默认复制构造函数
C++03: keep default copy constructor when using template constructor
假设我创建了一个 class 带有模板构造函数以稍后定义实现:
struct A {
template<typename T>
A(const T& arg);
};
如何避免覆盖编译器隐式生成的复制构造函数 A(const A&)
?在 C++11 中我可以做类似
的事情
#include <type_traits>
struct A {
template<typename T, class =
typename std::enable_if<std::is_same<A, T>::value>::type>
A(const T& arg);
};
并且有效。但是 C++03 不支持默认模板参数。这里有什么解决方法吗?
你不应该需要一个。当给定一个 A
时,有问题的构造函数将实例化为 A(const A&)
,这与实际的复制构造函数相同,因此首选非模板构造函数。
您无需执行任何操作。编译器生成的 coppy 构造函数将根据需要启动。复制构造函数不能是模板。例如,
#include <iostream>
struct A {
template<typename T>
A(const T& arg) { std::cout << "template\n"; }
};
int main()
{
A a(42); // template ctor
A b(a); // copy ctor
A c = b; // copy ctor
}
输出:
template
假设我创建了一个 class 带有模板构造函数以稍后定义实现:
struct A {
template<typename T>
A(const T& arg);
};
如何避免覆盖编译器隐式生成的复制构造函数 A(const A&)
?在 C++11 中我可以做类似
#include <type_traits>
struct A {
template<typename T, class =
typename std::enable_if<std::is_same<A, T>::value>::type>
A(const T& arg);
};
并且有效。但是 C++03 不支持默认模板参数。这里有什么解决方法吗?
你不应该需要一个。当给定一个 A
时,有问题的构造函数将实例化为 A(const A&)
,这与实际的复制构造函数相同,因此首选非模板构造函数。
您无需执行任何操作。编译器生成的 coppy 构造函数将根据需要启动。复制构造函数不能是模板。例如,
#include <iostream>
struct A {
template<typename T>
A(const T& arg) { std::cout << "template\n"; }
};
int main()
{
A a(42); // template ctor
A b(a); // copy ctor
A c = b; // copy ctor
}
输出:
template