gpt4 book ai didi

用于指定多个条件的 C++ 可变参数宏

转载 作者:搜寻专家 更新时间:2023-10-31 00:20:57 25 4
gpt4 key购买 nike

我怀疑我不能这样做,但我想我会先问问这里的明智社区。

我想检查少数(比如十个,但可能只有两个或三个)变量中的任何一个是否等于相同的特定值。例如

if (X == 3 || Y == 3 || Z == 3 || W == 3) ...

在 Python 中,我习惯于简单地做 if 3 in (X, Y, Z, W): ,但无论如何。

无论如何,我想知道是否有可能将它抽象成可变宏,例如 EQU_ANY(3, X, Y, Z, W)而不是写一堆 EQU_ANYX宏,其中 X 是参数的数量。

最佳答案

[使用宏的解决方案在最后,因为它相当可怕和令人讨厌。]


如果您不介意制作拷贝,使用 std::find 可能更简洁:

std::array<int, 4> values = { X, Y, Z, W };
if (std::find(values.begin(), values.end(), 3) != values.end()) { }

将这一行包装成一个函数通常很好:

template <typename Container, typename Value>
bool contains(const Container& c, const Value& v)
{
return std::find(c.begin(), c.end(), v) != c.end();
}

用作:

std::array<int, 4> values = { X, Y, Z, W };
if (contains(values, 3)) { }

在 C++0x 中,您可以使用初始化列表而不是创建临时数组:

if (contains({ X, Y, Z, W }, 3)) { }

(这适用于 gcc 4.5+;我还不知道有任何其他编译器支持此 C++0x 功能。)


如果你真的想避免复制对象(例如,如果它们很大或复制成本高),你可以使用相同函数的间接版本:

#include <boost/iterator/indirect_iterator.hpp>

template <typename Container, typename Value>
bool indirect_contains(const Container& c, const Value& v)
{
return std::find(boost::make_indirect_iterator(c.begin()),
boost::make_indirect_iterator(c.end()),
v)
!= boost::make_indirect_iterator(c.end());
}

用作:

std::array<int*, 4> values = { &X, &Y, &Z, &W };
if (indirect_contains(values, 3)) { }

或者,使用 C++0x 初始化列表:

if (indirect_contains({ &X, &Y, &Z, &W }, 3)) { }

由于 Jonathan Leffler 提到了 Boost.Preprocessor,下面是该解决方案的样子:

#include <boost/preprocessor.hpp>

#define SEQUENCE_CONTAINS_IMPL(r, data, i, elem) \
BOOST_PP_IIF(BOOST_PP_EQUAL(i, 0), BOOST_PP_EMPTY(), ||) \
((elem) == (data))


#define SEQUENCE_CONTAINS(elements, value) \
(BOOST_PP_SEQ_FOR_EACH_I(SEQUENCE_CONTAINS_IMPL, value, elements))

用作:

if (SEQUENCE_CONTAINS((X)(Y)(Z)(W), 3)) { }

扩展为:

if ((((X) == (3)) || 
((Y) == (3)) ||
((Z) == (3)) ||
((W) == (3)))) { }

(这既丑陋又可怕;我不会在我的代码中使用它,但如果你真的担心复制两个或三个值,你可能不希望有机会进行函数调用要么。)

关于用于指定多个条件的 C++ 可变参数宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5334852/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com