C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何专门针对所有参考类型的类c 03大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
请注意C 03是我真正需要的,但是对于knoledge,我也想在C11中看到一些更漂亮的实现.

我需要一个模板类

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只收到ints,那么我将能够使用专业化.
但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

解决方法

在这个线程 Specializing function template for reference types中看到(正确),这里建议的remove_reference将不起作用.它不会进入第二个实现EVER,因为编译器看到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);
}

如果你想提取一些类似的行为,并避免这个解决方案导致的代码重用,你可以很容易地将该行为提取到基类< 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

大佬总结

以上是大佬教程为你收集整理的如何专门针对所有参考类型的类c 03全部内容,希望文章能够帮你解决如何专门针对所有参考类型的类c 03所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: