ぷろみん

プログラミング的な内容を扱ってます

#ifdefだって置き換えられる

#defineによる定数やマクロの置き換えはconst, constexpr等で可能です。(全部ではないですが) #ifdefの置き換えは可能なのでしょうか?

class Calc{
public:
    void Execute(){
        int a = 1;
        int b = 2;
        int c = a + b;
#ifdef DEBUG
        std::cout << c;
#endif
    }
};
void main()
{
    Calc a;
    a.Execute();
}

templateの特殊化を使えば可能です。

struct Debug{};
struct Release{};
// ポリシーの設定
typedef Debug Policy;

class Calc{
    // 条件によって実行内容を変更させる関数を定義
    template<class T> void DebugPrint(int);
public:
    void Execute();
};

// Debugポリシーが設定されている場合はプリント
template<>
void Calc::DebugPrint<Debug>(int a){
    std::cout << a;
}

// Debugポリシーが設定されていない場合は何もしない
template<class T>
void Calc::DebugPrint(int){}

void Calc::Execute() {
    int a = 1;
    int b = 2;
    int c = a + b;
    // 呼び出し
    DebugPrint<Policy>(c);
}

void main()
{
    Calc a;
    a.Execute();
}