如何为所有引用类型C ++ 03专门化类

时间:2015-08-20 07:36:35

标签: 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);
};

我需要:

1)如果使用值类型编译A(包括指针,它们本身按值传递):

然后我需要A看起来像这样(完全像上面那样)

class A {
private:
    T m_member;

public:
    A(T _member);    
    //... MORE STUFF
    void foo(T param);
};

2)如果使用引用类型(例如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

1 个答案:

答案 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