运行时确定C+的类型+; 我想知道在C++中,类型是否可以作为运行时信息来确定。p>

运行时确定C+的类型+; 我想知道在C++中,类型是否可以作为运行时信息来确定。p>,c++,runtime,types,C++,Runtime,Types,(1) 虽然我的问题很笼统,但为了简单起见,我将从一个简单的例子开始: #include <stdio.h> #include <iostream> #include <cstring> using namespace std; int main(int argc, char * argv[]) { if (strcmp(argv[1], "int")==0) { int t = 2; }el

(1) 虽然我的问题很笼统,但为了简单起见,我将从一个简单的例子开始:

 #include <stdio.h>  
 #include <iostream>  
 #include <cstring>  
 using namespace std;  
 int main(int argc, char * argv[])  
 {  
 if (strcmp(argv[1], "int")==0)   
 {  
     int t = 2;   
 }else if (strcmp(argv[1], "float")==0)  
 {  
     float t = 2.2; 
 } 
 cout << t << endl;  // error: ‘t’ was not declared in this scope
 return 0;  
 }
#包括
#包括
#包括
使用名称空间std;
int main(int argc,char*argv[])
{  
if(strcmp(argv[1],“int”)==0)
{  
int t=2;
}else if(strcmp(argv[1],“float”)==0)
{  
浮动t=2.2;
} 

CUT< P>需要一个能够存储不同类型的值的类。从联盟中缩写,将是正确的选择。

< P>检查。< /P> < P> 1A:不,类型不是C++中的对象或值(例如,在Python中)。但是,可以使用由ARVV(1)的值选择的各种值。< /P> 1b:对不起,我不能这么做

2:dynamic_cast和typeid(两个操作符)是该语言目前提供的唯一查询类型的工具(这并不罕见,大多数语言都有很少但专用的工具),根据情况,通常不鼓励单独使用它们来查询类型(在其他语言中也不罕见)

2a:是的,因为这很简单,很明显,并且在这里有效,所以没有理由使用其他任何东西,但是作为示例代码,让我们假设您需要一个不同的解决方案。您可以调用在正确类型上实例化的函数模板,但是由于这与2a的其余部分几乎相同,所以我不讨论它

2b:使用子类模板的示例,因为它很方便:

struct Base {
  virtual ~Base() {}
  friend std::ostream& operator<<(std::ostream& s, Base const& v) {
    v._print(s);
    return s;
  }
private:
  virtual void _print(std::ostream&) const = 0;
};

template<class T>
struct Value : Base {
  T data;
  explicit
  Value(T const& data) : data(data) {}
private:
  virtual void _print(std::ostream& s) const {
    s << data;
  }
};
struct Base{
虚拟~Base(){}

friend std::ostream&operator+1我要发布多态解决方案。比boost.variant更有意义,因为使用boost.variant时,您需要检查每个操作的类型。原始问题中没有任何内容建议使用boost。他为什么要为一个函数包含一个全新的框架?对不起,我看不到这一点这是一个很有用的问题。@ DrCuffiRe:问题是问如何在C++中做一些事情。虽然很多有经验的C++开发人员可能没有听说过Boost,但是他们应该有。这个问题已经包括了对命名空间STD的引用,标准模板库,你可以考虑Boost作为STL的可行性。Boost中的库,因此对于给定的问题,只有某些库是有意义的。
struct Base {
  virtual ~Base() {}
  friend std::ostream& operator<<(std::ostream& s, Base const& v) {
    v._print(s);
    return s;
  }
private:
  virtual void _print(std::ostream&) const = 0;
};

template<class T>
struct Value : Base {
  T data;
  explicit
  Value(T const& data) : data(data) {}
private:
  virtual void _print(std::ostream& s) const {
    s << data;
  }
};
int main(int argc, char** argv) {
  using namespace std;
  auto_ptr<Base> p;
  string const type = argc > 1 ? argv[1] : "int";
  if (type == "int") {
    p.reset(new Value<int>(2));
  }
  else if (type == "float") {
    p.reset(new Value<double>(2.2));
  }
  cout << *p << '\n';
  return 0;
}