【问题标题】:Non-type template function overloading problem非类型模板函数重载问题
【发布时间】:2021-11-12 10:06:57
【问题描述】:

考虑:

template <size_t >
class SizeFlag {};

template <size_t START, size_t END>
void asd(SizeFlag<START>, SizeFlag<END>) {
}

template <size_t START>
void asd(SizeFlag <START>, SizeFlag<START + 1>) {
}

template <class T>
class TypeFlag{};

template <class T,class F>
void qwe(TypeFlag<T>,TypeFlag<F>){}

template <class T>
void qwe(TypeFlag<T>,TypeFlag<T*>){}

int main()
{
    asd(SizeFlag<1>{}, SizeFlag<2>{});// call to 'asd' is ambiguous in clang-11
    qwe(TypeFlag<int>{}, TypeFlag<int*>{});// use void qwe(TypeFlag<T>,TypeFlag<T*>) 
    cout << "Hello CMake." << endl;
    return 0;
}

为什么qwe(TypeFlag&lt;T&gt;,TypeFlag&lt;T*&gt;)qwe(TypeFlag&lt;T&gt;,TypeFlag&lt;F&gt;) 更专业,而void asd(SizeFlag &lt;START&gt;, SizeFlag&lt;START + 1&gt;) 却不比void asd(SizeFlag&lt;START&gt;, SizeFlag&lt;END&gt;) 更专业?

【问题讨论】:

  • 我记得,非类型参数是有问题的,使用类专业化进行一些测试有类似比较的问题Demo,即使在这种情况下类方式工作......:/
  • 重载和模板是一个复杂的组合。 this page 的“部分订购流程”部分是相关的,但让我很头疼,想弄清楚。

标签: c++ overload-resolution function-templates-overloading


【解决方案1】:

“更专业”适用于您的类模板,而不是您编写的函数。这些函数是重载的,并且不像类的部分特化那样“相关”。

你没有写类似

template <size_t START>
void asd<>(something something) {
}

也就是说,您的第二个函数中没有 &lt;&gt;。它只是重载,而不是相同模板的特化。

确定函数参数是否更好匹配的规则类似于T vs T&amp;,不要认为第二个函数的模板参数比第一个函数少。

完整规则见https://en.cppreference.com/w/cpp/language/function_template#Function_template_overloading

【讨论】:

  • 函数模板特化可以更特化:timsong-cpp.github.io/cppwp/over#match.best.general-2.5
  • @NathanOliver 我澄清了
  • 我的问题是为什么调用 qwe 是成功的,而调用 asd 是失败的,因为 ambiguous 。如果它是第二个函数的模板参数较少,则不会使其更好地匹配,为什么void qwe(TypeFlag&lt;T&gt;,TypeFlag&lt;T*&gt;) 是更好的匹配,但void asd(SizeFlag &lt;START&gt;, SizeFlag&lt;START + 1&gt;) 不匹配。 PS。是en.cppreference.com/w/cpp/language/…在“函数模板重载”中使用“更专业”来描述更好的匹配。
  • @uncertaintyprinciple 因为这是规则规定的! T* 是更专业的模板匹配。随意选择模板参数较少的模板并没有什么特别之处。仔细阅读该参考页面上列出的规则,看看该示例为何有效;通过非工作示例并在没有确定偏好的情况下到达终点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多