C++ C++;11-返回表达式以确定类型

C++ C++;11-返回表达式以确定类型,c++,types,c++11,return,decltype,C++,Types,C++11,Return,Decltype,C++11在类型推断和管理方面包含了大量优秀的功能。例如,auto和decltype——关键字已被证明是语言中值得添加的内容 当我采用这些简单但有效的特性时,我开始考虑实现某种反射系统。以下是我迄今为止成功做到的: /// ------------------------------------------------------------ /// @class Reflection /// @brief General-purpose reflection class. /// @exm

C++11在类型推断和管理方面包含了大量优秀的功能。例如,autodecltype——关键字已被证明是语言中值得添加的内容

当我采用这些简单但有效的特性时,我开始考虑实现某种反射系统。以下是我迄今为止成功做到的:

/// ------------------------------------------------------------
/// @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;
};
//------------------------------------------------------------
///@类反射
///@brief通用反射类。
///@exmpl获取类型id:
///自动a=反射::获取_id_type();
///auto b=反射::get_id_type();
///通过接收到的id获取类型:
///decltype(Reflection::get_type(a))d;
///@注意:禁止创建此类的实例。
/// ------------------------------------------------------------
课堂反思{
公众:
///静态成员函数:
模板
静态内联长get\u id\u类型(void){
返回reinterpret_cast(&Database::id);
}
静态自动获取类型(long const type_id)->decltype(/*UNFINISHED!*/){//这就是我遇到问题的地方。
//此函数体有意保留为空。
//重要的是返回类型。
}
私人:
///内部结构:
模板
结构数据库{
静态void*id;//在这里创建了void指针,因为只有这个变量的地址才重要。
};
///构造函数和析构函数:
反射(无效)=删除;
~Reflection(void)=删除;
///成员函数(重载运算符):
反射和运算符=(反射和运算符)=删除;
反射和运算符=(反射常数&)=删除;
};
代码应该足够容易理解。如果您阅读了带有注释的全部代码,您应该了解如何使用这个类。但问题是:

如何从函数“get_type”返回表达式以 通过decltype-说明符将此表达式转换为可用类型?”


提前感谢。

返回类型不能依赖于参数的运行时值。时期您试图执行的操作是不可行的。

您不能拥有依赖于参数的运行时值的返回类型。时期您试图做的事情不可行。

这看起来很有趣。。。出于某种原因,我想起了永动机:-)即使你能做到这一点,我也不确定它对你的反射系统有什么帮助。对于反射,您需要能够确定类在运行时有哪些成员。。。出于某种原因,我想起了永动机:-)即使你能做到这一点,我也不确定它对你的反射系统有什么帮助。对于反射,您需要能够在运行时确定类的成员。感谢您的快速回复!你会建议我做什么?@user1531111首先,如果可能的话,我会完全摆脱这种需要。如果真的有必要,您只能使用传统的解决方案:手工制作的类型信息对象,可能需要借助宏。C++11没有带来任何有帮助的东西。反射基本上是将类型信息从编译时间传递到运行时(这就是为什么你的方法永远不会用C++),C++仍然只有一种机制,即RTTI。这可能是一个稍微偏离的话题,但是如果有一个基类,例如“RealDebug数据库”,那是个好主意。派生您希望从中应用反射机制的每个类,并在执行此操作时通过ReflectionDatabase中的指针管理派生类?我不太熟悉所使用的常用技术,但我知道在堆栈溢出方面还有其他问题。您可能会发现搜索这些问题很有趣。谢谢您的快速回复!你会建议我做什么?@user1531111首先,如果可能的话,我会完全摆脱这种需要。如果真的有必要,您只能使用传统的解决方案:手工制作的类型信息对象,可能需要借助宏。C++11没有带来任何有帮助的东西。反射基本上是将类型信息从编译时间传递到运行时(这就是为什么你的方法永远不会用C++),C++仍然只有一种机制,即RTTI。这可能是一个稍微偏离的话题,但是如果有一个基类,例如“RealDebug数据库”,那是个好主意。派生您希望从中应用反射机制的每个类,并在执行此操作时通过ReflectionDatabase中的指针管理派生类?我不太熟悉所使用的常用技术,但我知道在堆栈溢出方面还有其他问题。你可能会发现搜索这些问题很有趣。