我是模板新手。我有一个问题,是否有一种方法可以使用非特定(或通用)类型作为参数来专门化类成员函数。也就是说,以下程序中的U1和U2可以说是U1类型的boost :: shared_ptr,而T1和T2是常规类型。
#include <iostream>
template <typename T1, typename T2>
class X {
public:
template <typename U1, typename U2>
void get_as(U1& source, U2& dest);
};
class Y {
};
template<> template<>
void
X<int, int>::get_as<double, double>(double& source, double& dest) {
std::cout << "SOURCE IS " << source << std::endl;
std::cout << "DESTINATION IS " << dest << std::endl;
}
template<> template<>
void
X<int, int>::get_as<shared_ptr, shared_ptr>(shared_ptr<Y>& source, shared_ptr<Y>& dest) {
//some logic
}
int main()
{
double d1 = 1.0;
double d2 = 1.1;
X<int, int> x;
x.get_as(d1, d2);
shared_ptr<Y> p1(new Y());
shared_ptr<Y> p2(new Y());
x.get_as(p1, p2); //Would this work?
return 0;
}
我尝试阅读它,但可以清楚地了解它是否可以完成。
答案 0 :(得分:1)
示例中的代码将无法编译,因为模板参数中显示的shared_ptr不是完整类型。要使其工作,您可以修改如下函数:
template<> template<>
void
X<int, int>::get_as<shared_ptr<Y>, shared_ptr<Y> >(shared_ptr<Y>& source, shared_ptr<Y>& dest) {
//some logic
}
但这可能不是您正在寻找的一般性。遗憾的是,您无法执行以下操作
template<> template<typename T>
void
X<int, int>::get_as<shared_ptr<T>, shared_ptr<T> >(shared_ptr<T>& source, shared_ptr<T>& dest) {
//some logic
}
这将是模板类的成员函数的部分模板特化。 C ++禁止这种事情。但是,在学习所有关于模板和模板专业化的知识时,经常会忘记仍有可用的旧函数重载。以下代码将按预期工作
class Y {
};
class Z {
};
template <typename T1, typename T2>
class X {
public:
template <typename U1, typename U2>
void get_as(U1& source, U2& dest);
template <typename U>
void get_as(shared_ptr<U> source, shared_ptr<U> dest);
void get_as(shared_ptr<Y> source, shared_ptr<Y> dest);
};
template<> template<>
void
X<int, int>::get_as<double, double>(double& source, double& dest) {
std::cout << "SOURCE IS " << source << std::endl;
std::cout << "DESTINATION IS " << dest << std::endl;
}
template <typename T1, typename T2>
template <typename U>
void X<T1, T2>::get_as(shared_ptr<U> source, shared_ptr<U> dest)
{
std::cout << "Overloaded member" << std::endl;
}
template <typename T1, typename T2>
void X<T1, T2>::get_as(shared_ptr<Y> source, shared_ptr<Y> dest)
{
std::cout << "Special overloaded member" << std::endl;
}
int main()
{
double d1 = 1.0;
double d2 = 1.1;
X<int, int> x;
x.get_as(d1, d2);
shared_ptr<Y> p1(new Y());
shared_ptr<Y> p2(new Y());
x.get_as(p1, p2); //Would this work?
shared_ptr<Z> p3(new Z());
shared_ptr<Z> p4(new Z());
x.get_as(p3, p4); //Would this work?
return 0;
}
输出
SOURCE IS 1
DESTINATION IS 1.1
Special overloaded member
Overloaded member