Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;与STL返回类型组合的模板_C++_Templates_Stl_Map_Overloading - Fatal编程技术网

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 ); }