c++ - 在运行时分配模板变量
问题描述
到目前为止,我有一些代码运行良好,但是有一个新的变化正在破坏它。寻找有关如何处理它的想法。我不是 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,这会影响其他变量的值。任何帮助是极大的赞赏。
解决方案
我能想到三种理智的方法。
一块一块地重写成 constexpr 函数,一路单元测试,保持旧版本不变。然后切换到 constexpr 函数的运行时版本。
将您的程序(或程序的一部分)包装在一个大模板中,该模板
A
作为参数。为每个有效的A
. 为此编写一个接口,以选择要使用这些大量模板实例中的哪一个。将其视为用另一种语言重新实现代码。使用现有代码作为基础,但不要重用它。编译时 C++ 与运行时 C++ 不太相似。
在我看来:2 是最快的,3 需要最少的技能才能取得进步,1 需要的时间最长但最不可能引入新的回归。
推荐阅读
- android - Android Studio:如何分离运行 APK 和构建 APK
- c# - 如何在 C# 中创建类的通用单例实例?
- r - 有没有办法在不使用任何内置函数或任何类型的循环的情况下在 R 中找到向量的摘要......只是向量之间的操作?
- typescript - TypeScript:在回调函数中键入元组
- git - Jenkins 多分支管道与 Jenkinsfile 不在存储库中
- linux - 将多个文件合并到一个文件中,包括 shell 中不匹配的行
- docker - docker内部的Jenkins管道使用最新的上游图像
- postgresql - Postgres 函数不明确的列引用
- computer-vision - 是否必须拥有图像形式的数据才能使用 Google Vision API 进行对象识别?
- java - 使用 Jackson 注释将对象序列化为 XML