我有一个用于类定义中的宏,用于定义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)
答案 0 :(得分:0)
实用的方法是为您关心的每个参数键入(或可能生成)宏。鉴于您可能不需要“简化”,例如。 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); \
}
但是,在您给定的示例中,此does not work因为所有成员都是私有的。您必须将它们放入friend
函数中,因此您需要一个宏,在这种情况下,您可以使用class_as_tuple
... {p>