首页 > 解决方案 > 在运行时分配模板变量

问题描述

到目前为止,我有一些代码运行良好,但是有一个新的变化正在破坏它。寻找有关如何处理它的想法。我不是 C++ 模板专家并且具有基本的工作知识。

namespace foo {
enum {
A1,
A2,
..
AN
};

constexpr int A = 
#if defined(SOME_DEFINE1)
A1,
#elif defined(SOME_DEFINE2)
A2,
...
#elif defined(SOME_DEFINEN)
AN
#endif
;

// Then I have some variables that depend on A
template<int> struct var1;
template<>struct var1<A1> { static constexpr auto value = v1; }
template<>struct var1<A2> { static constexpr auto value = v2; }
template<>struct var1<A3> { static constexpr auto value = v3; }

template<int> struct var2;
template<>struct var2<A1> { static constexpr auto value = x1; }
template<>struct var2<A2> { static constexpr auto value = x2; }
template<>struct var2<A3> { static constexpr auto value = x3; }
} // namespace foo

constexpr auto VAR1 = foo::var1<foo::A>::value;
constexpr auto VAR2 = foo::var2<foo::A>::value;

现在 VAR1 和 VAR2 在多个地方使用。我知道所有这些代码都将由编译器优化并且一切正常。

现在由于新的变化,我只能在运行时知道“A”的值,因此不能再声明为常量。A 将由某处的全局变量的值确定。关于如何实现这一点的任何想法,所以我对我的代码进行了非常小的更改。

假设有一个 gVal 可以是 1,2 或 3,基于此我想将 A 设置为 A1、A2 或 A3,这会影响其他变量的值。任何帮助是极大的赞赏。

标签: c++c++11templatesc++17constexpr

解决方案


我能想到三种理智的方法。

  1. 一块一块地重写成 constexpr 函数,一路单元测试,保持旧版本不变。然后切换到 constexpr 函数的运行时版本。

  2. 将您的程序(或程序的一部分)包装在一个大模板中,该模板A作为参数。为每个有效的A. 为此编写一个接口,以选择要使用这些大量模板实例中的哪一个。

  3. 将其视为用另一种语言重新实现代码。使用现有代码作为基础,但不要重用它。编译时 C++ 与运行时 C++ 不太相似。

在我看来:2 是最快的,3 需要最少的技能才能取得进步,1 需要的时间最长但最不可能引入新的回归。


推荐阅读