我真的希望我可以使用C++(11)模板来实现这一点,但我在这里面临一些问题。所以我们有一个自定义指针对象,它可以是任何这些类型:它自己类型的对象列表/ int/a char/bool/long/double/char *或任何其他基本类型,它由该对象存储的标志。有一些全局方法可以从这个对象中获取特定类型的值。C++条件模板基于数据类型编译
现在,我的目的很简单。我知道我的情况,我的目标是这样的对象的列表,所以我想写这样的功能,因为它是一个常见的场景:
template <typename T>
std::vector<T> List_To_Vector(Object& list)
{
std::vector<T> vec;
int listSize = Func_Size(list);
for (int i = 0; i < listSize; ++i)
{
//let's say this function gives list items one by one
Object arg = Func_Next(list);
if (std::is_same<T, int>::value || std::is_same<T, unsigned int>::value)
vec.push_back((T)Func_IntValue(arg));
else if (std::is_same<T, float>::value || std::is_same<T, double>::value)
vec.push_back((T)Func_DoubleValue(arg));
else if (std::is_same<T, std::string>::value || std::is_same<T, char*>::value)
vec.push_back((T)Func_StringValue(arg)); //Func_StringValue returns char*, so conversion to std::string should work
else if (std::is_same<T, bool>::value)
vec.push_back(Func_BoolValue(arg));
else if (std::is_same<T, char>::value)
vec.push_back(Func_CharValue(arg));
vec.push_back(val);
}
return vec;
}
int main()
{
Object listContainingStrings = GetListOfNames();
Object listContainingNumbers = GetListOfNumbers();
std::vector<string> vec1 = List_To_STD_Vector<string>(listContainingStrings);
std::vector<int> vec2 = List_To_STD_Vector<int>(listContainingNumbers);
return 0;
}
的问题是,C++抱怨在这里,因为它试图编译将T = std :: string和int转换为字符串或浮点转换为字符串转换的代码将失败。我真正想要的是一种在类型被检测为int而不是任何其他类型时编译代码的整型部分的方法。 我可以使用模板函数特化或重载,但是我认为它真的在这里打破了模板的目的,我可以为8种不同类型(例如List_To_String_Vector,List_To_Int_Vector等)编写8种不同的函数。
我也试过另一个黑客,使用reinterpret_cast < T * >上的每个返回类型的地址,然后解引用它来添加到向量。这种工作,但有编译器的警告,我认为这是未定义的行为。
有没有办法使这项工作正常?
谢谢!
这看起来像一个非常糟糕的设计。如果你想要一个对象来处理多种类型,那么为什么不使用即将出现的C++ 17标准中的['std :: any'](http://en.cppreference.com/w/cpp/utility/any) ?或者如果你还没有它,那么[Boost any](http://www.boost。组织/ DOC /库/ 1_63_0/DOC/HTML/any.html)? –
为什么您的'Func_ * Value'是单独的函数而不是单个模板或重载集? – Quentin
@Quentin:由于遗留代码,并执行Scheme编程语言以C++互操作。 –