如何根据处理编写返回不同类型的std :: list的C ++函数?

时间:2015-02-09 19:55:34

标签: c++ templates c++11 stl stdlist

以下代码在指定点有什么问题?我想根据文件中某处读取的程序返回整数或字符或字符串列表。我尝试下面的代码,但它会引发我的错误。你可以看到我对模板有点弱。

template <class T> 
std::list<T> function1(int type)
{
   using namespace std;
   if (1 == type)
      return list<int>(3, 100); / No error
   else if (2 == type){
      list<wchar_t> temp;
      temp.push_back(L'a');  // C2664 error here
      return temp;
   }else if (3 == type){
      list<wstring> temp;
      temp.push_back(L"a"); // C2664 error here
      return temp;
   }else
      return nullptr;   // C2664 error here
}

我已经指出了“visual studio 2013社区版更新4”抛出编译器错误C2664的要点。我怎么能这样写,我可以根据里面的处理得到列表?其中一个错误如下。

Error   1   error C2664: 'std::list<int,std::allocator<_Ty>>::list(std::initializer_list<_Ty>,const std::allocator<_Ty> &)' : cannot convert argument 1 from 'std::list<wchar_t,std::allocator<wchar_t>>' to 'const std::list<int,std::allocator<_Ty>> &'

3 个答案:

答案 0 :(得分:1)

这是不可能的,模板需要在编译时解决,但type的值在那里是未知的。您需要使用一些间接,例如boost::variant或非模板化接口。或者更确切地说,采用完全不同的方法。

答案 1 :(得分:0)

换句话说:模板本身不包含足够的信息来进行编译。您需要通过在使用模板时提供模板参数来实例化它;编译器不能决定稍后弄清楚它的参数(或者它可能涉及一些即时编译)。我不认为你可以使用专门化来解决这个问题,因为返回类型不兼容。 (对不起,我写了一个新答案......我还没有权利发表评论......)

很难确定list中对象的类型然后返回它或指向它的指针,以便您可以在调用function1的函数中使用它。您可以考虑重构代码。如果可能,您可以尝试从函数中调用进一步处理的其他函数。

如果你坚持从function1返回列表:我能想到的一个想法是创建一个包含指向列表的void*指针的包装类(动态分配) ,以及告诉你类型的东西(比如,int type)。但其他功能可能必须遵循这种模式。 JK。 (这肯定会造成它解决的麻烦。)

答案 2 :(得分:-1)

对于任何特定类型的函数模板的任何实例化,至少有一个文字可能与该类型不兼容。

您可以使用某些traits类的特化,它提供各种受支持类型的值。这样可以轻松支持新类型。或者您可以为各种支持的类型使用函数的重载。