使用CRTP确定生成代码
Using CRTP To Deterministically Generate Code
我最近一直进入模板向导,尤其是CRTP。我知道模板用于使编译器为我们生成代码,因此我想知道是否可以制作模板"确定"函数的哪些部分,我们希望它包含特定类的函数。例如,如果我有以下代码:
crtp.h
#include <iostream>
using std::endl;
using std::cout;
template<class T>
class A {
public:
void func() {
constexpr unsigned short mask = T::GetMask();
if (mask & 1) {
/*
Do Something
*/
cout << "Mask 1" << endl;
}
if (mask & 1 << 3) {
/*
Do Something else
*/
cout << "Mask 2" << endl;
}
}
};
class B : public A<B> {
friend class A<B>;
protected:
static constexpr unsigned short GetMask() { return 0x0001; }
};
class C : public A<C> {
friend class A<C>;
protected:
static constexpr unsigned short GetMask() { return 0x0009; }
};
main.cpp
#include "ctrp.h"
#include <iostream>
#include <vector>
using std::cout;
using std::vector;
using std::getchar;
using std::endl;
int main() {
B b;
C c;
cout << "B:" << endl;
b.func();
cout << endl << "C:" << endl;
c.func();
getchar();
}
执行时的生产:
B:
Mask 1
C:
Mask 1
Mask 2
这效果很好,完全可以做我想要的。问题是从我的角度来看,if语句应该不必要。当我处理恒定表达式时,编译器应该拥有简单地跳过分支所需的一切,并知道执行B类的第一部分,而这两个部分c。
c。我想兑现这一点,并特别告诉编译器删除特定类不必要的部分,以避免在运行时不必要的分支。不幸的是,我不知道该怎么做,有什么想法吗?预先感谢
编辑
响应一些很棒的建议C 17的constexpr,如果表达是我不知道的几乎完美的解决方案,但不幸的是无法使用。我仅限于使用C 14。
如果您关心性能,则编译器很可能会优化所有"死"分支机构,甚至if
条件,如果可以在编译时间内对其进行评估。
更糟糕的是,所有分支都需要很好地形成,直到C 17 constexpr if
。在这种情况下,您可以将功能"外包"到特殊(静态成员(功能,并使用专业化来调用正确的功能。请参阅@r Sahu的答案。
使用模板元编程在编译时间时模拟
不起作用。您必须想象是否使用其他心态。
而不是
if (mask & 1) {
/*
Do Something
*/
cout << "Mask 1" << endl;
}
if (mask & 1 << 3) {
/*
Do Something else
*/
cout << "Mask 2" << endl;
}
您必须沿着:
的线路使用一些东西 function1_selector<mask & 1>::dostuff();
function2_selector<mask & 1 << 3 >::dostuff();
其中
template <bool> struct function1_selector
{
static void dostuff() { /* Do nothing */ }
};
template <> struct function1_selector<true> // Specialize for true
{
static void dostuff() { /* Do something useful */ }
};
类似地添加function2_selector
的代码。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用CRTP确定生成代码
- c++模板代码顺序解析/CRTP
- 使用CRTP分离平台特定的代码
- Clang和Intel无法编译此CRTP代码