【问题标题】:How can I select a specific function overload?如何选择特定的函数重载?
【发布时间】:2014-08-03 16:37:49
【问题描述】:

我想将一个重载运算符传递给一个函数,该函数无法确定它应该使用两个重载中的哪一个。

// This works, not overloaded:
chai.add(chaiscript::fun(&HttpRequest::operator+), "+");
// This does not, overloaded:
chai.add(chaiscript::fun(&(
    std::map<std::string,std::string>::operator[]), "[]");

chaiscript::fun 需要一个泛型参数,但它无法确定要使用哪个重载。
我需要指定重载,但我不知道语法。 我试过这样的事情:

chai.add(chaiscript::fun(&(
    std::map<std::string,std::string>::operator[]<foo>), "[]");

但这不起作用。

指定重载的语法是怎样的?

【问题讨论】:

  • 运算符重载在这里是一个红字,你只想从重载集中选择一个特定的函数...
  • 请注意,括号不平衡。有趣的是,二元运算符和一元运算符一样有趣。

标签: c++ stl overloading operator-keyword


【解决方案1】:

以下内容可能会帮助您选择map::operator[]的一种重载

static_cast<
    std::string& (std::map<std::string, std::string>::*)(const std::string&)>(
        &std::map<std::string, std::string>::operator []);

或者typedef:

using MyMap = std::map<std::string, std::string>;

static_cast<std::string& (MyMap::*)(const std::string&)>(&MyMap::operator []);
//          ReturnType    Class     params

【讨论】:

  • static_cast 正是我想要的。谢谢
【解决方案2】:

首先,运算符只是具有特殊语法的函数。因此,重载运算符只是重载函数。考虑到这一点,您的问题归结为“如何选择一组重载函数中的一个?”。对此的简单回答是使用 static_cast。

另外,我认为您也可以在上下文已经指示要选择哪些重载的上下文中使用它。在您的情况下,您正在使用模板函数(我认为)并且它在那里不起作用,因为它需要类型来实例化模板并且它需要模板实例化来选择类型并因此重载。使用临时变量是解决此问题的一种方法,另一种方法是显式指定模板函数(例如 max&lt;float&gt;(0, x),否则将 0 视为整数类型)。

【讨论】:

  • 第二个选项是我想做的(明确指定模板函数)。问题是在我的具体情况下语法如何,因为我不知道将模板数据类型放在哪里。
  • 你必须提供更多的代码来帮助你。无论如何,就像我提到的 std::max 函数一样。格式为template&lt;typename T&gt; T max(T const&amp; t1, T const&amp; t2)。用两种不同的类型调用它不允许编译器推断出类型T,这就是为什么我明确地将类型放在尖括号中,如max&lt;float&gt;
猜你喜欢
  • 1970-01-01
  • 2019-03-30
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2015-05-19
  • 2010-09-27
相关资源
最近更新 更多