gpt4 book ai didi

c++ - 如何专门化所有引用类型的类 C++03

转载 作者:可可西里 更新时间:2023-11-01 15:25:10 27 4
gpt4 key购买 nike

请注意 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) 如果 A 是用引用类型编译的(例如 int&):

然后我需要 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 的用户可以使用任何类型:

主要.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 将不起作用。它永远不会进入第二个实现,因为编译器认为 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);
}

如果您想提取一些类似的行为并避免此解决方案导致的代码重复,您可以轻松地将该行为提取到一个 Base Class<T> 中。 , 做

template<typename T,bool isReference>
class A : public BaseClass<T>{
}

等等。

用法是

主要.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++ - 如何专门化所有引用类型的类 C++03,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32112210/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com