C++ C++;与STL返回类型组合的模板
我有一个模板化的类C++ C++;与STL返回类型组合的模板,c++,templates,stl,map,overloading,C++,Templates,Stl,Map,Overloading,我有一个模板化的类 template <typename T> class Factors { public: Factors(){}; deque<string> stringsDeck; // some methods and variables here map <string, string> getNext(); }; 在这种情况下,解决方案是什么?我希望字符串和其他类型(基本上是数字类型,可以通过词法转换从
template <typename T>
class Factors
{
public:
Factors(){};
deque<string> stringsDeck;
// some methods and variables here
map <string, string> getNext();
};
在这种情况下,解决方案是什么?我希望字符串和其他类型(基本上是数字类型,可以通过词法转换从字符串转换而来)的方法名称保持不变。您可以使用[
typeid
]
(http://en.cppreference.com/w/cpp/language/typeid)查看T
是否为字符串
比如:
template <typename T>
class Factors
{
public:
Factors(){};
deque<string> stringsDeck;
// some methods and variables here
map <string, T> getNext();
{
if (typeid(T) == typeid(string))
{
// Special handling for strings
}
else
{
// Do something else for other types
}
}
};
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();
{
if(typeid(T)=typeid(字符串))
{
//字符串的特殊处理
}
其他的
{
//为其他类型执行其他操作
}
}
};
编辑
正如fschoenm所建议的,模板专门化可能更好:
template <typename T>
class Factors
{
public:
Factors(){};
// some methods and variables here
map <string, T> getNext();
};
template <>
class Factors<string>
{
public:
Factors(){};
deque<string> stringsDeck;
// some methods and variables here
map <string, string> getNext();
};
模板
阶级因素
{
公众:
因子(){};
//这里有一些方法和变量
映射getNext();
};
模板
阶级因素
{
公众:
因子(){};
德克·斯特林斯达克;
//这里有一些方法和变量
映射getNext();
};
该语言不允许函数重载,函数重载只在
返回类型,因为在大多数情况下,在
函数重载解析。在这种情况下,你真的有三个
可能的解决办法:
- 最简单的(因此在大多数情况下是首选的解决方案)是
只是给这两个函数取不同的名称:
和 例如,getNextAsMapToType
getNextAsMapToString
- 或者,您可以将函数声明为模板:
template<typename U>
std::map<string, U> getNext();
然后,客户机代码只需调用
,具体取决于它们所调用的内容 对结果执行以下操作:getNext()
或getNextAsMapToString
将被调用。getNextAsMapToType
std::map
,另一个返回std::map
。是的,对于追溯兼容性问题,可能使用相同的名称。我想知道如何通过一些模板魔术来实现这一点。。。如果这不可能,我可能会将map getNext()
的名称更改为getNextReturnTypeAsString()
@linello您尝试过模板专门化了吗?这些类的名称相同,函数的名称也相同。如果您想要通用功能,只需要让getNext
方法有所不同,就可以从一个通用基类继承这两个方法。不知何故,您发布了HTML而不是Markdown。我知道我发布了,因为这是获得合理格式的唯一方法。任何时候我有点复杂的东西,我会转换到HTML。不幸的是,这使你的答案不正确。你似乎已经两次重载了操作符std::map()const
,这就是我在你的帖子中窥探的原因。我认为最后最好的方法是使用两个不同名称的函数,既可读又简单。也许代码复制会有点伤害,但在这种情况下,IMHO是可以接受的…@JamesKanze:我个人更喜欢模板化方法,这是你的第二个建议。它减少了代码的编写量,是最具前瞻性的。如果编写正确,您将不会有代码重复,因为从std::string转换为任何模板类型都可以通过类似boost::lexical_cast的方法完成。那么在调用getNext()
时,您将如何指定是要map
还是map
?或者,如果这两个函数是为T
(其中T
是封闭类模板的参数)定义的,那么您是否希望map
,或者string
?
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 ); }