gpt4 book ai didi

c++ - 在 C++ 中实现基于模板的可选类成员的最有效方法?

转载 作者:行者123 更新时间:2023-11-28 01:47:34 25 4
gpt4 key购买 nike

我有一个性能关键的应用程序,需要通过各种特征类来修改我的类的行为。一些更复杂的变体需要主类中的其他类成员。

所以我的问题是:根据所使用的特征类,提供此类成员的最有效方法是什么?

我想要的是这样的:

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 实例并且有许多不同的特征类,所以我不想为每个可能的特征设置“虚拟”变量。

实现它的一种可能性是通过继承,但这正是我首先要通过使用模板来避免的,因为这会导致性能损失,尤其是在具有多个不同特征时。

所以我的问题是:

  1. 我可以告诉编译器消除类中某些未使用的成员变量吗?
  2. 您将如何解决这个问题?有没有其他的可能性来实现这个?
  3. 哪种方法最有效?

最佳答案

对于这个例子,这应该可以,但我不知道它是否足以满足您的需求。

#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 和更高版本中)。如果不是,那么它仍然很可能会被优化。

关于c++ - 在 C++ 中实现基于模板的可选类成员的最有效方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44309812/

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