如何解决如何在函数参数中强制类型并避免隐式转换?
我有一个功能
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);
在这篇文章 How do I avoid implicit conversions on non-constructing functions? 中,他们完全删除了某些类型的使用,但事实并非如此。
谢谢。
解决方法
在 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
是一个概念,可以与简洁的模板语法一起使用。
这个解决方案的一个优点是编译器错误发生在调用点,告诉用户参数的类型是错误的。
,您可以在函数中添加第二个模板参数和一个 static_assert 以确保第二个参数与容器的值类型完全相同。
template<typename T,typename U>
static inline bool Contains(const T& container,const U& value)
{
static_assert(std::is_same_v<typename T::value_type,U>,"NO IMPLICIT CONVERSION ALLOWED");
return std::find(container.begin(),value) != container.end();
}
int main() {
std::vector<int> vec = {1,2,3};
Contains(vec,-5.2); // Fails now
}
完整示例 here。
,template<typename x_Container,typename x_Value>
static inline bool Contains(x_Container const & container,x_Value const & value)
{
static_assert(::std::is_same_v<typename x_Container::value_type,x_Value>);
return std::find(container.begin(),value) != container.end();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。