C++ 模板与 STL 返回类型相结合

标签 c++ templates stl dictionary overloading

我有一个模板化类(class)

template <typename T>
class Factors
{
    public:
    Factors(){};
    deque<string> stringsDeck;

    // some methods and variables here
   map <string, string> getNext();
};

getNext方法将用作键的字符串与 stringsDeck 中的字符串组合起来。用作值并返回 map <string,string> 。 前提是我已经模板化了stringifystring2num函数,我想要一个方法map<string,Scalar> getNext()对于除字符串之外的所有其他类型,它会将映射的值转换为指定的模板类型 T .

编译器不允许我重载两个具有相同名称但返回类型不同的方法,具体来说:

map <string, T > getNext()
{
// converts the values of getNext() return map into the specified type T
return convertedMapWithValuesOfTypeT;
}

这种情况有什么解决办法吗?我想保持字符串和其他类型的方法名称相同(基本上是数字类型,可以通过词法转换从字符串转换)

最佳答案

该语言不允许函数重载,其区别仅在于 返回类型,因为大多数情况下,不考虑返回类型 函数重载解析。在这种情况下,你确实有三个 可能的解决方案:

  • 最简单的(因此在大多数情况下是首选解决方案)是 只是给这两个函数不同的名称: getNextAsMapToTypegetNextAsMapToString ,例如。
  • 或者,您可以将函数声明为模板:
    template<typename U>
    std::map<string, U> getNext();
    
    然后,将此函数专门化为 std::stringT (并且对于 没有其他的)。用户必须指定 getNext<std::string>()getNext<<i>...</i>>给他想要的人打电话。 一般来说,我会发现这比 以前的解决方案,但它可能适用于模板,其中 名称应包含或至少暗示类型的名称。
  • 最后,可以在返回时模拟重载 输入,如果您不介意一些额外的复杂性。要做到这一点,你仍然 必须实现其他解决方案之一,但是客户端代码 没有看到它。基本上,你的getNext()函数必须返回一个 代理,具有重载的转换函数,例如:
    class Proxy
    {
        Factors* myOwner;
    public:
        Proxy( Factors& owner ) : myOwner( &owner ) {}
        operator std::map<std::string, std::string>() const
        {
            return myOwner->getNextAsMapToString();
        }
        operator std::map<std::string, T>() const
        {
            return myOwner->getNextAsMapToType();
        }
    };
    
    Proxy getNext() { return Proxy( *this ); }
    
    然后,客户端代码只需调用 getNext() ,并取决于他们 处理结果,或者 getNextAsMapToString或者 getNextAsMapToType将被调用。

关于C++ 模板与 STL 返回类型相结合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8399175/

相关文章:

c++ - 当函数未在默认返回路径上显式返回值时强制出错?

c++ - 在 C++ 中创建具有非常量长度的数组时会发生什么?

c++ - 为什么 std::for_each(from, to, function) 返回函数?

c++ - 如何将模板实例传递给需要将模板参数传递给基类的函数?

javascript - 模板文字 js

c++ - 清除 vector 时,STL vector 内部的 STL vector 是否超出范围?

c++ - CLion CMake ld:找不到库+ Vulkan和OpenGL问题

c++ - vector<double> 在公差范围内查找 double

c++ - 像列表一样订购但按键访问?

c++ - 如何从字符串中解析欧元符号?