2016-05-23 8 views
2

私のプログラムでは、機能と似たマクロがたくさんあります。それらのマクロの中には、同じ名前とパラメータを持つものがあります。名前空間のようないくつかの規則でそれらを区切りたいのですが、マクロを名前空間でグループ化することはできません。マクロの名前空間のような機能

これを行う別の方法はありますか?

注:マクロは単なる割り当てではないため、多くの変数をconst変数に置き換えることはできません。例えば

二つのマクロがある場合、:

#define A(B, C, D) \ 
{     \ 
    D = B * C;  \ 
} 

#define A(B, C, D) \ 
{     \ 
    D = B/C;  \ 
} 

を私はいくつかの名前空間でそれらを分割したい:

/* Pseudocode */ 
namespace Multiply { 
    #define A(B, C, D) \ 
    {     \ 
     D = B * C;  \ 
    } 
} 

namespace Divide { 
    #define A(B, C, D) \ 
    {     \ 
     D = B/C;  \ 
    } 
} 

はその後、私のプログラムでMultiply::ADivide::Aを呼び出すことができます。

+1

"名前空間に関数を定義することはできません"。どういう意味ですか? – CinCout

+0

あなたがここで何を求めているのか分かりません。 – jcoder

+0

ようこそ。あなたの質問を編集して、いくつかのサンプルコードとあなたが達成したいものを表示してください。 – kebs

答えて

3

編集マクロのような機能について質問しているようです。

C++には、のようなものがあります。のように、「マクロのような機能」ですが、名前空間に従います。それは関数です。代わりにマクロ

#define A(B, C, D) \ 
{     \ 
    D = B * C;  \ 
} 

のあなたは、関数を書くことができます:

int operation(int left, int right) 
{ 
    return left * right; 
} 

あなたはそれがint以外のタイプで作業する必要がある場合は、関数テンプレートを作成することができます。

この例のように単純なことは、マクロや関数を使用せずにそのまま乗算を書くことです。


あなたは、異なるクラスの静的メンバ関数としてあなたの機能を分割することができます。しかし、私はそれをお勧めしません。代わりに、名前空間で関数を定義することが許されていないという愚かな要求をあきらめることをお勧めします。

2

インライン関数を使用します。少なくとも提供した例では、これは適切なことです。

タイプを知っている場合は、テンプレートは必要ありません。あなたはそれがどのようなタイプのために仕事をしたい場合しかし、あなたが実行します。テンプレート定義は、コンパイラかもしれ常にインラインとにかく必要とされている

namespace Multiply { 
    template<typename BT, typename CT, typename DT> 
    void A(BT B, CT C, DT & D) 
    { 
     D = B * C; 
    } 
} 

ので。

constexprは、コンパイル時の実行のみを目的とする場合に便利です。 C++ 11では、上記の例ではうまくいきませんでした。しかし、C++ 14ではそうかもしれません。

+0

テスト済み:http://codepad.org/g9o1n30H – mdr

関連する問題