0

C++11には、型推論管理全体に関して、驚くほど多くの優れた機能が含まれています。たとえば、autoおよびdecltypeキーワードは、言語に追加する価値があることが証明されています。

これらのシンプルでありながら効果的な機能を採用するにつれて、何らかのリフレクション システムを実装することを考え始めます。これが私がこれまでやってのけたことです:

/// ------------------------------------------------------------
/// @class  Reflection
/// @brief  General-purpose reflection class.
/// @exmpl  Get type id:
///             auto a = Reflection::get_id_type<int>();
///             auto b = Reflection::get_id_type<Object>();
///         Get type via received id:
///             decltype(Reflection::get_type(a)) d;
/// @note   It is forbidden to create an instance of this class.
/// ------------------------------------------------------------
class Reflection{
public:
    /// Static member functions:
    template<typename T>
    static inline long get_id_type(void){
        return reinterpret_cast<long>(&Database<T>::id);
    }
    static auto get_type(long const type_id) -> decltype(/* UNFINISHED! */){ // This is where I'm having problems.
        // This function body is intentionally left empty.
        // All that matters is the return type.
    }
private:
    /// Inner structures:
    template<typename T>
    struct Database{
        static void* id; // Created void pointer here, because only the address of this variable matters.
    };
    /// Constructors & destructors:
    Reflection(void) = delete;
    ~Reflection(void) = delete;
    /// Member functions (overloaded operators):
    Reflection& operator=(Reflection&&) = delete;
    Reflection& operator=(Reflection const&) = delete;
};

コードは理解しやすいものでなければなりません。コメントを含めてコード全体を読むと、このクラスの使用方法が理解できるはずです。しかし、問題は次のとおりです。

「この式をdecltype -specifierによって使用可能な型に変換するために、関数 "get_type" から式を返すにはどうすればよいですか?」

前もって感謝します。

4

1 に答える 1

4

引数の実行時の値に依存する戻り値の型を持つことはできません。限目。あなたがやろうとしていることは実現不可能です。

于 2012-09-07T14:49:54.430 に答える