簡體   English   中英

在C ++中為每個可變參數宏參數加上一個函數參數的名稱

[英]Prepend each variadic macro argument with a name of a function parameter in C++

我有一個在類定義內部用於定義as_tuple()成員函數的宏。

#define DEFINE_AS_TUPLE(...) \
    auto as_tuple() const \
    { \
        return std::tie(__VA_ARGS__); \
    } \
    auto as_tuple() \
    { \
        return std::tie(__VA_ARGS__); \
    }

但我想擁有一個宏,用於在類外部定義class_as_tuple函數。 共同點應該看起來像這樣:

#define DEFINE_AS_TUPLE_OUTSIDE_OF_CLASS(ClassName, ...) \
    inline auto class_as_tuple(const ClassName & val) \
    { \
        return std::tie(__VA_ARGS__); \
    } \
    inline auto class_as_tuple(ClassName & val) \
    { \
        return std::tie(__VA_ARGS__); \
    } \

但目前尚不清楚如何在VA_ARGS前面加上“ val”。 在std :: tie()調用中。

為了使問題更清楚,我提供了一個有關如何使用第一個宏的示例:

class B
{
public:

    B() : m_set{ 0, 1, 2 }, m_v{3, 4}
    {
    }

    DEFINE_AS_TUPLE(m_set, m_v, m_u8, m_b)

private:

    std::set<int> m_set;
    std::vector<int> m_v;

    uint8_t m_u8 = 25;

    bool m_b = true;
};

但我還需要:

DEFINE_AS_TUPLE_OUTSIDE_OF_CLASS(B, m_set, m_v, m_u8, m_b)

實用的方法是為您關心的每個參數鍵入(或可能生成)宏。 鑒於您可能不需要“簡化”(例如)10個以上的成員,並且這種模式在您的代碼中顯然足夠普遍,可以保證像這樣的宏,那么手工寫出它們可能是最簡單的方法。 例如:

#define DEFINE_AS_TUPLE_OUTSIDE_OF_CLASS_2(ClassName, a, b) \
    inline auto class_as_tuple(const ClassName& val) \
    { \
        return std::tie(val.a, val.b); \
    } \
    inline auto class_as_tuple(ClassName& val) \
    { \
        return std::tie(val.a, val.b); \
    }

#define DEFINE_AS_TUPLE_OUTSIDE_OF_CLASS_3(ClassName, a, b, c) \
    inline auto class_as_tuple(const ClassName& val) \
    { \
        return std::tie(val.a, val.b, val.c); \
    } \
    inline auto class_as_tuple(ClassName& val) \
    { \
        return std::tie(val.a, val.b, val.c); \
    }

但是,這在您給定的示例中不起作用 ,因為所有成員都是私有成員。 您必須將它們變成friend函數,因此需要一個宏,在這種情況下,您可以使用val.as_tuple()編寫class_as_tuple

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM