【问题标题】:Is having only a single template specialisation useful?只有一个模板专业化有用吗?
【发布时间】:2017-09-15 09:41:56
【问题描述】:

我想知道以下方法之间的主要区别是什么。如果定义std::to_string,是否有两种情况之一会导致问题?

include <string>
using namespace std;


enum class eColor
{
   Red
};

void to_string(eColor color)
{
}

template<typename C = eColor)
void to_string(C color)
{
}



int main()
{
   to_string(eColor::Red); // assume only one of the above is defined
   return 0;
}

是否存在应该首选上述其中一项的情况?

【问题讨论】:

  • 您的模板会造成混乱。见stackoverflow.com/questions/1452721/…
  • 另外,你为什么想要一个模板?
  • 我认为模板版本没有多大意义。但是您的示例过于简单,您也应该展示实现。
  • @juanchopanza 我真的很想知道是否有任何正当理由。
  • @juanchopanza 别介意我,我的大脑在度假。

标签: c++ c++11 templates tostring template-specialization


【解决方案1】:

您的函数 to_string(eColor color) 并不是真正的模板专业化,因为它在定义之前错过了模板。因此编译器将其视为完全定义的函数,而不是使用具体类型生成的模板。这意味着只要编译器可以匹配参数列表,就会一直使用这个函数。

【讨论】:

    【解决方案2】:

    尽管你的 using 指令对命名空间造成了不必要的污染,如果你打算使用像 to_string 这样的名称,这尤其奇怪:

    模板函数会自动推导出它们的模板参数。所以以下内容绝对有效:

    int main(int argc, const char * argv[]) {
        to_string(eColor::Red);
        to_string("Hey");
        to_string(42);
        return 0;
    }
    

    因此,如果您真的打算为一种专用类型定制您的函数,那么您会遇到一些非常有趣的错误消息,或者更糟糕的是没有错误消息与不需要的行为相结合。

    函数版本至少可以防止一些错误情况。 (它仍然会接受 42,因为存在隐式转换)。

    【讨论】:

      猜你喜欢
      • 2013-10-27
      • 1970-01-01
      • 2020-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 1970-01-01
      相关资源
      最近更新 更多