【问题标题】:C++ typeid as a return typeC++ typeid 作为返回类型
【发布时间】:2014-01-04 21:36:56
【问题描述】:

有没有办法在 C++ 中使用 typeid 或类似于返回类型的东西?

例如:

我在类中有一个私有变量,可以设置为任何类型。我怎么能把它退回来,因为下面没有编译。

#include <type_traits>

typeid(MyVariable) GetValue(){
    return MyVariable;
}

【问题讨论】:

  • 您是在问如何从函数中返回typeid(...) 表达式的结果?
  • std::type_info GetType() { return typeid(MyVariable); } 返回类型,然后可能是void GetValue(void *ptr) { *(SomeType *)ptr = MyVariable; }?但这看起来真的太可怕了。这听起来像是一个 XY 问题——你想用这个解决什么问题?也许你只是在寻找简单的多态性?跨度>
  • typeid 用于当您必须调查类型的错位名称而不是类型推断时,在 C++11 中有 decltypeauto 只是为了那。此外,如果您的班级能够接受“任何”类型,为什么不直接使用模板类型 T 作为返回类型?
  • @H2CO3 - 感谢您的回答:我不是在寻找任何形式的多态性 - 我只是想看看是否有比我创建的 any 类更简单的解决方案。 void* 会变得非常丑陋,所以我尽量远离他们 :)
  • 可以在编译时或运行时设置为任意类型吗?

标签: c++ return typeid


【解决方案1】:

我猜这里的混淆是关于“可以设置为任何类型”的意思。

我从以下四种方式中读到了其中一种:

  1. 您已经实现了类似 boost::Any 的类,并希望将其隐藏在您的类中,并在调用时返回其内容。
  2. 您有一个模板定义,其中一个模板参数提供 MyVariable 的类型信息
  3. 您正在尝试为使用 boost::Any 模拟定义的变量返回 type_info 对象
  4. 您正试图为模板中定义的变量返回 type_info 对象

如果是 1 或 3:

template<typename T> T GetValue() { return any_cast<T>(MyVariable); }
const std::type_info &GetValueType() { return MyVariable.type(); }

您没有提供 boost::Any 模拟如何工作的详细信息,所以我只是假设它是一个 boost::Any 实例(我个人从未使用过,所以希望我的语法是正确的)。如果您尝试从 MyVariable 中提取错误的类型,则会抛出此错误。如果您更喜欢处理指针和 NULL 值,请这样做:

template<typename T> T* GetValue() { return any_cast<T*>(&MyVariable); }

如果 T 不是存储在变量中的项目的类型,这将返回一个 NULL 指针。

如果是 2 或 4:

好吧,在这种情况下,您在某处有一个模板参数,它定义了 MyVariable 的类型。像这样的东西就是你想要的:

template<typename T> class Holder {
    T MyVariable;
    T &GetValue() { return MyVariable; }
    const std::type_info & GetValueType() { return typeid(T); }
};

嗯,希望其中一个答案与您要问的问题相符:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    • 2021-09-29
    • 2018-04-06
    • 2015-06-29
    • 1970-01-01
    相关资源
    最近更新 更多