[英]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 ++ 17的constexpr if expression是我不知道的近乎完美的解决方案,但不幸的是无法使用。 我仅限于使用C ++ 14。
如果您关心性能,则编译器很可能会优化所有“死”分支,甚至if
条件,前提是它可以在编译期间进行评估。
更糟糕的是,直到C ++ 17 constexpr if
,所有分支都必须形成良好。 在这种情况下,您可以将功能“外包”给特殊(静态成员)功能,并使用特殊化来调用正确的功能。 有关示例,请参见@R Sahu的答案。
用模板元编程在编译时模拟if / else不能那样工作。 您必须想象是否使用其他思维方式。
代替
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
添加代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.