【问题标题】:which function is used, template or not? [duplicate]使用哪个功能,模板与否? [复制]
【发布时间】:2017-12-27 09:56:57
【问题描述】:

我已经声明了两个函数:

template<typename T>
void foo(T& in) { cout << in; }
void foo(bool& b) { cout << "Bool:" << (b ? "True" : "False");}

我这样调用函数:

bool var = false; foo(var);

我知道我可以编写测试代码。但如果这是一个依赖于编译器的选择, 编写测试代码永远不会完全覆盖。

【问题讨论】:

  • 我的意思是调用:bool var = false; foo(var);
  • 如果它是一个依赖于编译器的选择,你怎么能期望得到一个答案?
  • 它不依赖于编译器(除非编译器出错)。如果一个模板和一个 nin-template 匹配得很好,则首选非模板。顺便说一句,您可以使用out &lt;&lt; std::boolalpha &lt;&lt; true;bool 格式化为字符串(该标志在重置之前一直有效)。默认情况下,格式为true(或false)。如果确实有必要,可以使用自定义std::numpunct&lt;char&gt; facet 更改字符串。

标签: c++ function


【解决方案1】:

第二个,即:

void foo(bool& b) { cout << "Bool:" << (b ? "True" : "False");}

因为它更适合bool var = false; foo(var);

一般来说,重载决议倾向于非模板化方法而不是模板化方法,正如您可以在ref 中看到的那样:

最佳可行函数

F1 被确定为比 F2 更好的函数 if 隐式转换 [..]:

F1 是非模板函数,而 F2 是模板特化


PS:这依赖于编译器,因为有一些规则描述了在这种情况下如何发生重载解析,正如我上面提到的。

【讨论】:

    【解决方案2】:

    重载解析通常更喜欢非模板函数而不是模板函数。因此将调用bool&amp; 版本。这是明确定义的,不由编译器决定。

    有关详细信息,请参阅cppreference,“最佳可行功能”部分。 (我可以尝试链接到标准,但可能更难阅读。)

    【讨论】:

      猜你喜欢
      • 2010-09-13
      • 2020-03-31
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2013-08-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多