C ++ 11 включает в себя множество замечательных функций, когда дело доходит до тип вычета а также управление в целом. Например авто а также 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;
};
Код должен быть достаточно легким для понимания. Если вы читаете полный код с комментариями, вы должны понимать, как использовать этот класс. Но вопрос в том,
«Как мне вернуть выражение из функции» get_type «, чтобы
превратить это выражение в пригодный для использования тип decltype-Спецификатор?»
Заранее спасибо.
Вы не можете иметь тип возврата, который зависит от время выполнения аргумента. Период. То, что вы пытаетесь сделать, неосуществимо.
Других решений пока нет …