C++ C++;11-返回表达式以确定类型
C++11在类型推断和管理方面包含了大量优秀的功能。例如,auto和decltype——关键字已被证明是语言中值得添加的内容 当我采用这些简单但有效的特性时,我开始考虑实现某种反射系统。以下是我迄今为止成功做到的: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
/// ------------------------------------------------------------
/// @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中的指针管理派生类?我不太熟悉所使用的常用技术,但我知道在堆栈溢出方面还有其他问题。你可能会发现搜索这些问题很有趣。