我有一个模板化类(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>
。
前提是我已经模板化了stringify
和string2num
函数,我想要一个方法map<string,Scalar> getNext()
对于除字符串之外的所有其他类型,它会将映射的值转换为指定的模板类型 T
.
编译器不允许我重载两个具有相同名称但返回类型不同的方法,具体来说:
map <string, T > getNext()
{
// converts the values of getNext() return map into the specified type T
return convertedMapWithValuesOfTypeT;
}
这种情况有什么解决办法吗?我想保持字符串和其他类型的方法名称相同(基本上是数字类型,可以通过词法转换从字符串转换)
最佳答案
该语言不允许函数重载,其区别仅在于 返回类型,因为大多数情况下,不考虑返回类型 函数重载解析。在这种情况下,你确实有三个 可能的解决方案:
- 最简单的(因此在大多数情况下是首选解决方案)是
只是给这两个函数不同的名称:
getNextAsMapToType
和getNextAsMapToString
,例如。 - 或者,您可以将函数声明为模板:
template<typename U> std::map<string, U> getNext();
然后,将此函数专门化为std::string
和T
(并且对于 没有其他的)。用户必须指定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/