使类成员constexpr并将对象存储在stl容器

时间:2017-11-01 09:54:49

标签: c++ c++11 templates constexpr

我有一个带有一些变量的简单对象。我将其中一些对象存储在一个数组中:

class Obj {
public:
  Obj(int i, int j) : var(i), var2(j) { 
            obj.initialize(); //or something
  }
  int var, var2;
  MyOtherNonConstExprObject obj;
}
...
std::array<Obj> v{Obj{1,2}, Obj{3,4}};

现在,出于优化目的,我想制作var constexpr。 请注意,我无法创建整个对象/构造函数constexpr,因为在编译时不知道MyOtherNonConstExprObject。

我的最终目标是能够在编译时做同样的事情(我的热门路径充满了那些测试):

if constexpr(v[0].var == v[1].var) {
...
}

根据我的理解,这意味着我需要创建Obj的模板,否则我的非模板化类的所有实例将具有var的相同值(这有意义)。

所以我做了类似的事情:

template<int v, int w>
class Obj {
    public:
        constexpr int var() const {
            return v;
        }
        constexpr int var2() const {
            return w;
        }
        ....
};

通过调用constexpr函数来访问var。 这一切都很好,除非我尝试将Obj s与不同的模板值放在同一个向量中。

我不能constexpr const std::array<Obj> o{Obj<1,2>{}, Obj<3,4>{}},因为2个对象有不同的类型。

任何人都知道如何为某个给定类的实例声明一个类成员constexpr并将它们存储在一个stl容器中吗?

请注意:

  1. 我不想使用std :: any,因为转换成本似乎太高(并且std :: variant在int参数AFAIK上是不现实的。)
  2. 我不想使用多态(调用v-table的费用)
  3. 编辑:将矢量更改为数组,添加第二个模板参数。

0 个答案:

没有答案