运行时确定C+的类型+; 我想知道在C++中,类型是否可以作为运行时信息来确定。p>
(1) 虽然我的问题很笼统,但为了简单起见,我将从一个简单的例子开始:运行时确定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
#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;
}