如何在函数参数中强制类型并避免隐式转换?
我有一个功能
template<typename T>
static inline bool Contains(T container, const typename T::value_type& value)
{
return std::find(container.begin(), container.end(), value) != container.end();
}
是否有选项禁止此函数的隐式转换?
这段代码应该编译失败:
std::vector<int> vec = {1, 2, 3};
Contains(vec, -5.2);
在这篇文章中,如何避免对非构造函数进行隐式转换?它们完全消除了某些类型的使用,但事实并非如此。
谢谢。
回答
在 C++20 中,它会像这样简单:
template<typename T>
static inline bool Contains(T container, std::same_as<typename T::value_type> auto const& value)
{
return std::find(container.begin(), container.end(), value) != container.end();
}
这段代码中std::same_as有一个概念,可以与简洁的模板语法一起使用。
这种解决方案的一个优点是编译器错误发生在调用站点,告诉用户参数的类型是错误的。