繁体   English   中英

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

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

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

所以我的问题是:

  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及更高版本中)。 如果不是,那么仍然很有可能会对其进行优化。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM