【问题标题】:I want to know the type of a variable我想知道变量的类型
【发布时间】:2014-10-25 20:39:05
【问题描述】:

我正在查看 C++11 库,我不擅长使用 C++ 对象和模板,但我试图读取变量的类型并运行不同的代码,但这里有一个示例说明更好:

if(is_scalar<typeid(list)>)
    cout << list << endl;
else
    for(...)
        cout << list[i] << endl;

我正在尝试做类似的事情,我认为函数 is_scalar 正是我需要的,因为我需要将向量、数组和列表从整数、双精度数或浮点数等中拆分出来。 很难想到在同一个程序中具有不同类型的相同变量,但我试图在运行时(仍然无法正常工作)或使用预处理器定义(这导致我现在出现问题)更改它。

【问题讨论】:

  • 您将始终知道变量的类型,因为您创建了变量并为其指定了类型。你不能在运行时神奇地改变它。您可以推断它,但您的后续代码必须在语法上正确在编译时。基本上我不是 100% 确定你想要做什么,但我 90% 确定你不能在 C++ 中做到这一点。也许您正在寻找 PHP 或 JavaScript。
  • typeid 是一个运行时运算符。你想要decltype。不过,我也不清楚你到底在问什么。
  • 也许您会发现pretty printer 有用?
  • 要根据对象的类型运行不同的代码,您应该查看template specialization
  • 我创建了我正在寻找的东西,decltype 现在可以正常工作并运行我的代码。谢谢克里斯!现在我该如何结束这个问题?

标签: c++ c++11 metaprogramming typetraits


【解决方案1】:

我解决了我的问题,我创建了这个 code,我不得不稍微修改一下

#include <iostream>
#include <vector>
using namespace std;

template< bool B > struct Algorithm {
    template<class T1> static int do_it (T1 & a) {
        for (int _n(((int)((a).size()))-1), i(0); i <= _n; i++)
            cout << *(next(a.begin(),i)) << endl;
        cout << endl; 
    }
};

template<> struct Algorithm<true> {
    template<class T1> static int do_it (T1 a)  { cout << a << endl; }
};

template<class T1>
int elaborate (T1 A)
{
    return Algorithm<std::is_scalar<T1>::value>::do_it( A ) ;
}

int main(){
    int a = 42;
    vector<int> b;
    b.push_back(1);
    b.push_back(2);
    elaborate(a);
    elaborate(b);
    return 0;
}

最后,decltype 不起作用,因为编译器试图“读取”从未“使用”过的代码。

【讨论】:

    【解决方案2】:

    你尝试过使用 decltype 吗?这可以帮助你。

    http://en.cppreference.com/w/cpp/language/decltype

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-24
      • 2011-03-30
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-04
      相关资源
      最近更新 更多