有没有办法使用标准C++从GCC扩展模拟__typeof__?

use*_*419 5 c++ gcc templates typeof decltype

这个问题的常见答案是标准C++ decltype具有与之相同的功能__typeof__.

哪个不是真的.虽然decltype只能接受表达式作为参数,__typeof__但也可以接受类型名称.

不管这看起来多么奇怪,我有一个真实的用例,我需要在没有扩展名的情况下使用此扩展程序将平台上的东西移植到平台上.表达式和类型都由宏传入,因此重写的版本必须同时接受这两者.

简化的示例伪代码:

// from header.h
#define MYMACRO(a)                                            \
                                                              \
    /* long code */                                           \
                                                              \
    using MyTypeA = decltype(some_processing_of #a)           \
    using MyTypeB = __typeof__(a);                            \
                                                              \
    /* long code */                                           \
                                                              \
    using MyType = std::conditional_t<                        \
        is_string_literal_test                                \
        , MyTypeA                                             \
        , MyTypeB >;                                          \
                                                              \
    /* long code */                                           \



// from use_case1.cpp
struct S {};
MYMACRO(S)



// from use_case2.cpp
MYMACRO("some text")



// example of __typeof__ in GCC that compiles
struct S {};
using T1 =  __typeof__(S);
using T2 =  __typeof__("some text");
Run Code Online (Sandbox Code Playgroud)

问题不在于周围应用程序的设计,而是在GCC中实现的规范中模拟__typeof__扩展.

虽然用例比__typeof__的完整规范略窄.如果它适用于字符串文字,那么它就足够了,而不是所有通用表达式.在模板和/或SFINAE尝试的情况下,这并不容易.

当然,出于我的内部目的,我可以为字符串文字编写MYMACROA,为类型编写MYMACROB,我根本不介意.但它没有使用__typeof__扩展的原始解决方案的用户体验.这就是我对它感兴趣的原因.