如何编译时检测重载模板的重载函数?

时间:2018-04-26 09:52:49

标签: c++ c++14

假设我们有一个模板:

template <class T>
void VeryImportantFunction(T t) {
    // something
}

在某处,它被称为:

// ..
int a = 12345;
VeryImportantFunction(a);
// ..

这是一个包含大量源代码的非常大的项目,偶尔会在代码的深处出现一个带有重载函数的新标题:

void VeryImportantFunction(int t) {
    // totally another behavior
}

上面的代码片段将调用重载函数,因为它具有更高的优先级。

我们可以以某种方式禁用或以其他方式编译时检测可能使我们的重要模板超载的函数吗?

2 个答案:

答案 0 :(得分:8)

你的问题不清楚,但这是我的看法。

如果要点击模板重载,可以通过显式指定模板参数来调用该函数:

VeryImportantFunction

如果您希望将来再次发生这种情况,请将struct设为lambda或inline const auto VeryImportantFunction = [](auto x){ /* ... */ }; // no one can overload this! - 那些不能“外部”重载:

VeryImportantFunction

如果你想在没有外部工具的情况下知道VeryImportantFunction(5, 5, 5, 5); // error... will likely show all candidates 的所有重载,那么以完全错误的方式调用它 - 编译器错误可能会显示所有考虑的重载:

def post_list(request):
  posts = Post.published.all()
  return render(request,'blog/post/list.html',{'posts': posts})

答案 1 :(得分:1)

inline void VeryImportantFunction(int t)
{ 
    VeryImportantFunction<int>(t); // call the template function
}
模板定义后立即

然后,如果某人编写了自己的void VeryImportantFunction(int t)版本,您将收到编译错误。