29

C++11 の各式には値カテゴリがあります。lvalue、xvalue、または prvalue のいずれか。

任意の式を引数として指定すると、必要に応じて文字列 "lvalue"、"xvalue"、または "prvalue" を生成するマクロを作成する方法はありますか?

例えば:

int main()
{
    int x;

    cout << VALUE_CAT(x) << endl; // prints lvalue
    cout << VALUE_CAT(move(x)) << endl; // prints xvalue
    cout << VALUE_CAT(42) << endl; // prints prvalue
}

どのようVALUE_CATに実装できますか?

4

3 に答える 3

1

また、clang API のClassification関数を使用して、式を含む clang AST から式のカテゴリを返すこともできます。もちろん、clang を介して実際の AST を生成する必要があるため、これは @Luc のソリューションよりもはるかに複雑です。

于 2013-05-19T20:13:17.737 に答える
0
#ifndef _TPF_TYPE_NAME_H
#define _TPF_TYPE_NAME_H

template <typename T>
constexpr bool is_lvalue_helper = std::is_lvalue_reference<T>::value;

template <typename T>
constexpr bool is_xvalue_helper = std::is_rvalue_reference<T>::value;

template <typename T>
constexpr bool is_prvalue_helper = !(is_lvalue_helper<T> || is_xvalue_helper<T>);

template <typename T>
constexpr bool is_rvalue_helper = is_xvalue_helper<T> || is_prvalue_helper<T>;

template <typename T>
constexpr bool is_glvalue_helper = is_xvalue_helper<T> || is_lvalue_helper<T>;

#define is_lvalue(type_instance) is_lvalue_helper<decltype((type_instance))>
#define is_xvalue(type_instance) is_xvalue_helper<decltype((type_instance))>
#define is_prvalue(type_instance)is_prvalue_helper<decltype((type_instance))>
#define is_rvalue(type_instance) is_rvalue_helper<decltype((type_instance))>
#define is_glvalue(type_instance)is_glvalue_helper<decltype((type_instance))>

#endif // end of _TPF_TYPE_NAME_H
于 2022-02-12T14:33:33.927 に答える