C可变参数宏调用另一个可变参数宏

塔120

我有以下代码(原样):

template<class T, class FieldT>
using addRefU = typename std::conditional<
                            std::is_rvalue_reference<T>::value,
                            typename std::add_rvalue_reference< FieldT >::type,
                            typename std::conditional<
                                std::is_rvalue_reference<FieldT>::value,
                                typename std::add_rvalue_reference< FieldT >::type,
                                typename std::add_lvalue_reference< FieldT >::type
                            >::type
                        >::type;

#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(X,##__VA_ARGS__, 4, 3, 2, 1, 0)
#define VARARG_IMPL2(base, count, ...) base##count(__VA_ARGS__)
#define VARARG_IMPL(base, count, ...) VARARG_IMPL2(base, count, __VA_ARGS__)
#define VARARG(base, ...) VARARG_IMPL(base, VA_NARGS(__VA_ARGS__), __VA_ARGS__)


#define REF2(val, p1) addRefU<decltype(val), decltype(val.p1)>
#define REF3(val, p1, p2) addRefU<decltype(val), decltype(val.p1.p2)>
#define REF4(val, p1, p2, p3) addRefU<decltype(val), decltype(val.p1.p2.p3)>
#define REF5(val, p1, p2, p3, p4) addRefU<decltype(val), decltype(val.p1.p2.p3.p4)>
#define REF(...) VARARG(REF, __VA_ARGS__)     // It says REF is not defined here



#define CAST_REF2(val, p1) static_cast<REF(val, p1)>(val.p1)
#define CAST_REF3(val, p1, p2) static_cast<REF(val, p1, p2)>(val.p1.p2)
#define CAST_REF4(val, p1, p2, p3) static_cast<REF(val, p1, p2, p3)>(val.p1.p2.p3)
#define CAST_REF5(val, p1, p2, p3, p4) static_cast<REF(val, p1, p2, p3, p4)>(val.p1.p2.p3.p4)
#define CAST_REF(...) VARARG(CAST_REF, __VA_ARGS__)


struct A{};
struct B{A a;};

int main()
{
    B b;

    using t = REF(b, a);    // Ok

    auto &&k = CAST_REF2(b, a); // work
    auto &&k1 = CAST_REF(b, a); // NOT work

    return 0;
}

http://coliru.stacked-crooked.com/a/8dff49f68b7e15e1

如果我改变

#define CAST_REF2(val, p1) static_cast<REF(val, p1)>(val.p1)

#define CAST_REF2(val, p1) static_cast<REF2(val, p1)>(val.p1)(更改REFREF2

有用。我不明白为什么我可以REF直接调用而不能从宏执行此操作。

轨道轻赛

您的代码(包含在内)将预处理为以下内容

struct A{};
struct B{A a;};

int main()
{
    B b;

    using t = addRefU<decltype(b), decltype(b.a)>

    auto &&k = static_cast<VARARG(REF, b, a)>(b.a);
    auto &&k1 = static_cast<addRefU<decltype(b), decltype(b.a)> >(b.a);

    return 0;
}

显然,VARARG它没有被扩展,这是因为它在的扩展中已经被扩展了CAST_REF(并非如此CAST_REF2):

[C++11: 16.3.4/2]:如果在此替换列表扫描期间找到了要替换的宏的名称(不包括源文件的其余预处理令牌),则不会替换该宏。此外,如果任何嵌套的替换遇到要替换的宏的名称,则不会替换它。这些未替换的宏名称预处理令牌不再可用于进一步替换,即使它们稍后(在重新以其他方式替换了该宏名称预处理令牌的情况下)进行了检查。

该规则的目的是禁止无限递归,即使在这种特殊情况下您实际上没有风险。

之前已经在Stack Overflow上对此进行了讨论,但是目前还不确定(如何复制VARARG除外)如何解决它

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C可变参数宏调用另一个可变参数宏

来自分类Dev

对的C ++可变参数宏

来自分类Dev

如何检索C99可变参数宏的最后一个参数?

来自分类Dev

如何检索C99可变参数宏的最后一个参数?

来自分类Dev

如何在调用另一个宏时使用宏参数?

来自分类Dev

在另一个宏的字符串参数中使用Freemarker宏调用

来自分类Dev

C-可变参数宏,它扩展为每个参数上的一组宏调用

来自分类Dev

可变参数宏参数

来自分类Dev

在 C++ 中,在每个可变参数宏参数前面加上一个函数参数的名称

来自分类Dev

如何从可变长度函数创建宏?其中宏值是另一个可变长度函数

来自分类Dev

可变参数宏

来自分类Dev

宏中的可变参数

来自分类Dev

如何从Objective-C宏调用可变参数方法?

来自分类Dev

C:将参数从可变参数传递到可变宏

来自分类Dev

GCC宏扩展以调用另一个宏

来自分类Dev

如何正确使用可变参数宏调用其他宏

来自分类Dev

如何在将C ++宏作为参数传递给另一个宏之前对其进行扩展

来自分类Dev

一组可变参数宏

来自分类Dev

宏中的逗号以将参数传递给另一个宏函数(#define a,b)

来自分类Dev

NASM - 宏本地标签作为另一个宏的参数

来自分类Dev

如何在C ++中将可变参数函数与另一个函数消除歧义

来自分类Dev

ANSI C中的可变参数宏替代

来自分类Dev

如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

来自分类Dev

在将宏作为参数传递给另一个宏之前按值翻译宏

来自分类Dev

可变参数UNUSED函数/宏

来自分类Dev

可变参数异构FREE宏

来自分类Dev

可变参数异构FREE宏

来自分类Dev

从C ++中的另一个宏调用多个宏

来自分类Dev

具有可变数量和参数类型的C ++函数作为另一个函数的参数

Related 相关文章

  1. 1

    C可变参数宏调用另一个可变参数宏

  2. 2

    对的C ++可变参数宏

  3. 3

    如何检索C99可变参数宏的最后一个参数?

  4. 4

    如何检索C99可变参数宏的最后一个参数?

  5. 5

    如何在调用另一个宏时使用宏参数?

  6. 6

    在另一个宏的字符串参数中使用Freemarker宏调用

  7. 7

    C-可变参数宏,它扩展为每个参数上的一组宏调用

  8. 8

    可变参数宏参数

  9. 9

    在 C++ 中,在每个可变参数宏参数前面加上一个函数参数的名称

  10. 10

    如何从可变长度函数创建宏?其中宏值是另一个可变长度函数

  11. 11

    可变参数宏

  12. 12

    宏中的可变参数

  13. 13

    如何从Objective-C宏调用可变参数方法?

  14. 14

    C:将参数从可变参数传递到可变宏

  15. 15

    GCC宏扩展以调用另一个宏

  16. 16

    如何正确使用可变参数宏调用其他宏

  17. 17

    如何在将C ++宏作为参数传递给另一个宏之前对其进行扩展

  18. 18

    一组可变参数宏

  19. 19

    宏中的逗号以将参数传递给另一个宏函数(#define a,b)

  20. 20

    NASM - 宏本地标签作为另一个宏的参数

  21. 21

    如何在C ++中将可变参数函数与另一个函数消除歧义

  22. 22

    ANSI C中的可变参数宏替代

  23. 23

    如何创建一个C ++宏来定义使用调用另一个函数的参数列表的函数?

  24. 24

    在将宏作为参数传递给另一个宏之前按值翻译宏

  25. 25

    可变参数UNUSED函数/宏

  26. 26

    可变参数异构FREE宏

  27. 27

    可变参数异构FREE宏

  28. 28

    从C ++中的另一个宏调用多个宏

  29. 29

    具有可变数量和参数类型的C ++函数作为另一个函数的参数

热门标签

归档