在C++中,是否有一种方法可以在运行时选择类的通用类型,或者这是编译时的事情?
我想做的事情类似于这样(伪代码):
Generictype type;
if(somveval==1)
type = Integer;
if(someval==2)
type = String;
list<type> myList;
在C++中是否可能实现?如果是,怎么做?
在C++中,是否有一种方法可以在运行时选择类的通用类型,或者这是编译时的事情?
我想做的事情类似于这样(伪代码):
Generictype type;
if(somveval==1)
type = Integer;
if(someval==2)
type = String;
list<type> myList;
在C++中是否可能实现?如果是,怎么做?
这是一个编译时的问题。编译时必须知道模板参数类型。
话虽如此,使用某些模板元编程技术,你可以在编译时选择一个类型,但前提是所有可能的类型都是在编译时已知,并且只有在编译时可以解析选择类型的条件时才能进行选择。
例如,使用部分特化,您可以根据整数在编译时选择类型:
template <typename T>
class Foo
{ };
template <int N>
struct select_type;
template<>
struct select_type<1>
{
typedef int type;
};
template<>
struct select_type<2>
{
typedef float type;
};
int main()
{
Foo<select_type<1>::type> f1; // will give you Foo<int>
Foo<select_type<2>::type> f2; // will give you Foo<float>
}
正如其他人所回答的,你问题的答案是“不”,C ++不支持运行时动态类型。我只想指出,根据你想要实现什么,你可以使用联合来模拟这种动态类型,这就是COM中实现的VARIANT类型的方式。
我想不出这种情况会有什么用处,但是……
#include "boost/variant.hpp"
#include <list>
#include <string>
boost::variant<std::list<int>, std::list<std::string> >
unknown(int someval) {
if (someval == 1)
return boost::variant<std::list<int>, std::list<std::string> >(
std::list<int>());
else if (someval == 2)
return boost::variant<std::list<int>, std::list<std::string> >(
std::list<std::string>());
}
最接近的是:
template <typename T>
void do_stuff_with_list
{
list<T> myList;
...
}
enum Type
{
Integer = 1,
String
};
void do_stuff(Type type)
{
switch (type)
{
case Integer:
do_stuff_with_list<int>();
break;
case String:
do_stuff_with_list<string>();
break;
};
}