c++ - 在 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
函数,所以你需要一个宏,在这种情况下你可以class_as_tuple
用val.as_tuple()
...
推荐阅读
- node.js - Node JS Streams:理解数据连接
- eclipse - 从 TestNG 的类路径中排除依赖项
- delphi - 在内联汇编器中调用 Exception.CreateRes
- javascript - javascript 在特定点 id 处将对象插入数组并增加其他 id
- excel - 查找包含特定年份的第一个日期
- python - 多个 TCP 到串行连接 python 尝试。
- kentico - Kentico 11 页面类型字段显示名称
- arrays - 如何使用 Sprintf 转义 YAML 文件获取的字符串中的单引号
- c# - Data First EF,系统表与系统命名空间冲突
- python - 将字符串转换为与纳秒不同单位的时间戳