Gul*_*zar 5 c++ if-statement c-preprocessor c++03
请注意C++ 03!任何C++ 11解决方案都不适合我,但只是出于知识的缘故发布它们.
我知道预处理器可以做以下事情:
#define FOO 4
#if FOO == 4
cout<<"hi"<<endl;
#endif
Run Code Online (Sandbox Code Playgroud)
我需要的是:
#define BAR(X)\
#if X == 4\
cout<<"hi"<<endl;\
#endif
Run Code Online (Sandbox Code Playgroud)
main.cpp中
BAR(4)
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在预处理器时间内无法获得所有必需的信息.
那么,请告诉我如何实现这种行为.
编辑1:正常的if条件对我的情况不起作用,因为我也做了类似的事情:
#define BAR(X)\
#if X == 4\
int poop;
#elif
double poop;
#endif
Run Code Online (Sandbox Code Playgroud)
这里的一些答案比其他答案更好。我接受的是 Christian Kiewiet 在评论中发布的,但它对于我的目的来说是最准确的。这是扩展版本:
用例.h
enum UseCases{
useCase1=0,
useCase2,
useCaseNumber//always last for iterations
}
Run Code Online (Sandbox Code Playgroud)
专家.h
#include "useCases.h"
<template UseCases theCase>
struct StaticCase{
//empty, thus accidents calling from this can't happen
}
//specialization
template<>
class StaticCase<UseCases::useCase1>{
typedef int T;
static foo(T arg){cout<<"case1";};
}
template<>
class StaticCase<UseCases::useCase2>{
typedef double T;
static foo(){cout<<"case2";};
}
Run Code Online (Sandbox Code Playgroud)
现在,我可以做
#define BAR1(useCase) StaticCase<useCase>::foo();
Run Code Online (Sandbox Code Playgroud)
或者
#define BAR2(useCase) StaticCase<useCase>::T var;
Run Code Online (Sandbox Code Playgroud)
和电话:
BAR1(UseCases::useCase1)//output - case1
BAR1(UseCases::useCase2)//output - case2
Run Code Online (Sandbox Code Playgroud)