-5

可変個引数マクロのように可変個引数テンプレート マクロを定義する方法はありますか?

たとえば、可変長マクロを次のように定義するとします。

#define PRINT_STRING(fmtId, ...) { \
    CString fmt; \
    fmt.FormatString(fmt, ##__VA_ARGS__); \
    cout << fmt << endl; }

次のように定義できますか。

#define PARSE_FUNCTION(functionName, typename...) \
    std::function<int(typename...)> m_##functionName(){ \
        return (std::function<int(typename...)>) functionName; }
4

1 に答える 1

1

__VA_ARGS__複数回使用できるため、次のように記述できます。

#define PARSE_FUNCTION(functionName, ...) \
    std::function<int(__VA_ARGS__)> m_##functionName() { \
        return std::function<int(__VA_ARGS__)>(functionName); \
    }

何が起こっているかは単純なテキスト置換であり、引数がテンプレート用であるかどうかはプリプロセッサによってチェックされません。

実際には、どの関数オブジェクトも暗黙的に に変換できるstd::functionため、キャストを省略できます。さらに、functionName関数ポインターを参照する場合、正確な型は簡単に推測でき、可変引数マクロはまったく必要ありません。

#define PARSE_FUNCTION(functionName) \
    auto m_##functionName() \
        -> std::function<std::remove_pointer<decltype(functionName)>::type> \
    { \
        return functionName; \
    }
于 2013-04-23T08:01:02.947 に答える