[英]Most efficient way to implement template-based optional class members in C++?
我有一个性能至关重要的应用程序,需要通过各种特征类来修改我的类的行为。 一些更复杂的变体在主类中需要其他类成员。
所以我的问题是:根据所使用的traits类,提供此类成员的最有效方法是什么?
我想要的是这样的:
template <class Traits> MainClass {
typedef typename Traits::MemberType MT;
public:
MT my_member;
void do_something() {
std::cout << Traits::get_number(this) << std::endl;
}
...
};
class Zero {
public:
typedef void MemberType;
static inline int get_number(MainClass<Zero>*) { return 0; }
}
class IntegerNumber {
public:
typedef int MemberType;
static inline int get_number(MainClass<IntegerNumber>* myclass) { return myclass->my_member; }
}
现在这行不通,因为您不能将变量声明为void。 但是由于我将拥有大量的MainClass实例,并且有许多不同的特征类,所以我不想为每个可能的特征都设置“虚拟”变量。
实现此功能的一种可能是通过继承,但这正是我首先要避免使用的模板,因为这可能会导致性能下降,尤其是在具有多个不同特征的情况下。
所以我的问题是:
对于此示例,应该这样做,但我不知道它是否足以满足您的需求。
#include <algorithm>
#include <iostream>
#include <vector>
template <class MemberType>
class MainClassBase
{
public:
MemberType my_member;
};
template <>
class MainClassBase<void>
{
};
template <class Traits>
class MainClass : public MainClassBase<typename Traits::MemberType> {
public:
void do_something() {
std::cout << Traits::get_number(this) << std::endl;
}
};
class Zero {
public:
typedef void MemberType;
static inline int get_number(MainClass<Zero>*) { return 0; }
};
class IntegerNumber {
public:
typedef int MemberType;
static inline int get_number(MainClass<IntegerNumber>* myclass) { return myclass->my_member; }
};
class String {
public:
typedef std::string MemberType;
static inline std::string get_number(MainClass<String>* myclass) { return myclass->my_member; }
};
int main()
{
MainClass<Zero> mainClassZero{};
MainClass<IntegerNumber> mainClassInteger{};
mainClassInteger.my_member = -1;
MainClass<String> mainClassString{};
mainClassString.my_member = "asd";
mainClassZero.do_something();
mainClassInteger.do_something();
mainClassString.do_something();
}
演示: http : //coliru.stacked-crooked.com/a/013aabb763149596
如果您的类型是标准布局,则必须优化空基类(在C ++ 11及更高版本中)。 如果不是,那么仍然很有可能会对其进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.