请注意C ++ 03是我真正需要的,但出于知识的考虑,我想在C ++ 11中看到一些更漂亮的实现。
我需要一个模板类
template <typename T>
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
我需要:
然后我需要A看起来像这样(完全像上面那样)
class A {
private:
T m_member;
public:
A(T _member);
//... MORE STUFF
void foo(T param);
};
int&
)编译A:然后我需要A看起来像这样:
class A{
private:
T& m_member;
public:
A(T& _member);
//... MORE STUFF
void foo(T param); // still the same T, not T&
};
如果我知道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
答案 0 :(得分:2)
正如此线程Specializing function template for reference types中所见(正确),此处建议的remove_reference不起作用。它只是不会进入第二个实现EVER,因为编译器看到T&amp;和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);
}
如果您想提取一些类似的行为并避免此解决方案导致的代码重复,您可以轻松地将该行为提取到Base Class<T>
,然后执行
template<typename T,bool isReference>
class A : public BaseClass<T>{
}
等等。
用法是
的main.cpp
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