C++预处理器条件参数

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)

Gul*_*zar 1

这里的一些答案比其他答案更好。我接受的是 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)