【发布时间】:2017-01-23 12:10:19
【问题描述】:
我真的希望我可以使用 C++ (11) 模板来实现这一点,但我在这里遇到了一些问题。所以我们有一个自定义指针对象,它在内部可以是这些类型中的任何一种:它自己类型的对象列表/一个 int/a char/bool/long/double/char* 或任何其他原始类型,它由此对象存储的标志。有一些全局方法可以从此对象获取特定类型的值。
现在,我的目的很简单。我知道对于我的情况,我的对象是此类对象的列表,所以我想编写一个这样的函数,因为这是一个常见的场景:
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 到 string 或 float 到 string 的转换会失败。我在这里真正想要的是一种在类型被检测为 int 而不是任何其他类型时编译代码的 int 部分的方法。 我可以使用模板函数特化或重载,但我认为它真的违背了模板的目的,我可以为 8 种不同类型(例如 List_To_String_Vector、List_To_Int_Vector 等)编写 8 个不同的函数。
我还尝试了另一种技巧,在每个返回类型的地址上使用 reinterpret_cast
有没有办法让它正常工作?
谢谢!
【问题讨论】:
-
为什么你的
Func_*Value的单独函数而不是单个模板或重载集? -
@Quentin :由于 Legacy 代码,以及执行 Scheme 编程语言对 C++ 的互操作性。
-
@Someprogrammerdude:是的,非常糟糕的设计。我只是想通过它航行。 :( 。我们仅限于 C++ 11(即使那是最近的变化)
-
哇。这么多好答案!请给我一些时间来分析每个问题并将其中一个标记为答案,尽管我很感谢你们所有人!
标签: c++ c++11 templates vector