C++新手问题:设计一个函数来返回字符串或双重过载或模板的向量?

Ant*_*Ant 2 c++ templates overloading

我编写了一个在文本文件中搜索名称的函数.它返回向量,其中向量的每个元素是不同的名称.

现在我想在同一个文本文件中搜索数字并在向量中返回数字.

这可能是一个愚蠢的问题,但我想知道最好的方法是什么.通过编写第二个函数来重载函数,该函数返回向量或通过将类型替换为T来将我已经写入的函数转换为模板,如向量中所示.

我感到困惑的模板选项的原因是,我不知道,如果字符串和数值类型,如双和INT是在模板兼容.任何提示将不胜感激!谢谢.

pae*_*bal 5

由于函数签名不包含其返回类型,因此不能仅对其返回类型重载函数.

此外,由于这两个函数返回不同类型的数据(一个可以返回人名,另一个可以返回人年龄),两者具有相同的名称似乎是语义错误.

但无论如何...

将返回类型部件移回签名

void retrieveData(std::vector<std::string> & data) ;
void retrieveData(std::vector<double>      & data) ;

void foo()
{
   std::vector<std::string> strings ;
   std::vector<double> doubles ;

   // retrieve the strings
   retrieveData(strings) ;
   // retrieve the numbers
   retrieveData(doubles) ;
}
Run Code Online (Sandbox Code Playgroud)

这个解决方案最好是因为重载工作"按原样",并且因为它避免了向量的副本(我使用C++ 03,这里......在C++ 0x中,人们会使用移动语义来避免潜在的额外副本).

使返回类型成为签名的一部分(非模板版本)

std::vector<std::string> retrieveData(std::string * dummy) ;
std::vector<double>      retrieveData(double      * dummy) ;

void foo()
{
   // retrieve the strings
   std::vector<std::string> strings = retrieveData((std::string *) NULL) ;
   // retrieve the numbers
   std::vector<double> doubles = retrieveData((double *) NULL) ;
}
Run Code Online (Sandbox Code Playgroud)

这里,虚拟参数的指针值不在函数体中使用.它的用途是使编译器能够找到正确的重载.

这很丑陋(没有提到通过复制C++ 03中的向量返回的部分,但这不是主题),但是它完成了工作,并且是一个可行的答案.

使返回类型成为签名的一部分(模板版本)

// declared, but not defined
template<typename T>
std::vector<T> retrieveData() ;
// defined
template<>
std::vector<std::string> retrieveData<std::string>() ;
// defined
template<>
std::vector<double>      retrieveData<double>() ;

void foo()
{
   // retrieve the strings
   std::vector<std::string> strings = retrieveData<std::string>() ;
   // retrieve the numbers
   std::vector<double> doubles = retrieveData<double>() ;
}
Run Code Online (Sandbox Code Playgroud)

这里,模板参数由用户给出,从而为编译器提供足够的信息来选择正确的重载

PS:这个答案与我在这里给出的答案非常相似:根据返回值重载C++函数