Or *_*r B 11 c++ template-specialization c++03
请注意C++ 03是我真正需要的,但出于知识的考虑,我想在C++ 11中看到一些更漂亮的实现.
我需要一个模板类
template <typename T>
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
Run Code Online (Sandbox Code Playgroud)
我需要:
然后我需要A看起来像这样(完全像上面)
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
Run Code Online (Sandbox Code Playgroud)
int&):然后我需要A看起来像这样:
class A{
private:
T& m_member;
public:
A(T& _member);
//... MORE STUFF
void foo(T param); // still the same T, not T&
};
Run Code Online (Sandbox Code Playgroud)
如果我知道A只接收了整数,那么我将能够使用专业化.但是A的用户可以使用任何类型:
main.cpp中
A<int> a1;//1st version
A<int&> a2;//2nd version
A<B> a3;//1st version
A<B&> a4;//2nd version
A<C*> a5;//1st version
Run Code Online (Sandbox Code Playgroud)
正如在此线程Specializing function template for reference types中(正确地)看到的,此处建议的remove_reference将不起作用。它只是永远不会进入第二个实现,因为编译器认为 T& 和 T 是一样的。
相反,您可以使用相同的专业化技巧手动告诉编译器它现在正在处理引用类型
template<typename T, bool isReference>
class A {
};
template<typename T>
class A<T,false>{
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
}
/////////////////////////
template<typename T>
class A<T,true>{
private:
T& m_member;
public:
A(T& _member);
//... MORE STUFF
void foo(T param);
}
Run Code Online (Sandbox Code Playgroud)
如果您想提取一些类似的行为并避免此解决方案导致的代码重复,您可以轻松将该行为提取到 Base Class<T>,然后执行
template<typename T,bool isReference>
class A : public BaseClass<T>{
}
Run Code Online (Sandbox Code Playgroud)
等等。
用法是
主程序
A<int,false> a1;//1st version
A<int&,true> a2;//2nd version
A<B,false> a3;//1st version
A<B&,true> a4;//2nd version
A<C*,false> a5;//1st version, as pointers are value types
Run Code Online (Sandbox Code Playgroud)