确保谓词函数在c++模板化函数中有效
Making sure a predicate function is valid in C++ templated function
在编写接受谓词函数的函数时,例如下面的函数;如何确保谓词函数是有效的(即operator()
的返回类型是有效的)?
template <typename Predicate>
std::vector<SomeType> SearchList( Predicate func )
{
std::vector<SomeType> vecResults;
for( const auto& someObj : someTypeList )
{
if( func( someObj ) )
vecResults.emplace_back( someObj );
}
return vecResults;
}
环顾c++ 11中的类型特征设施,我发现了std::is_convertible<From,To>
,看起来应该有所帮助,尽管我不确定如何使用它来检查从operator()
到bool
是否有合适的隐式转换。我唯一能想到的是:
static_assert( std::is_convertible<Predicate(SomeType), bool>::value, "Predicate type must be convertible to bool" );
或:
static_assert( std::is_convertible<Predicate::operator()(SomeType), bool>::value, "Predicate type must be convertible to bool" );
您可以使用:
#include <utility> // For std::declval<>()
static_assert(
std::is_convertible<decltype(func(std::declval<SomeType>())), bool>::value,
"Predicate's return type must be convertible to bool");
如果你只有Predicate
类型或者不想在表达式中使用func
:
static_assert(
std::is_convertible<
decltype(std::declval<Predicate&>()(std::declval<SomeType>())),
bool>::value,
"Predicate's return type must be convertible to bool");
相关文章:
- 为什么将值返回函数传递给重载=运算符对运算符函数有效,而对其他运算符无效
- 递归函数有效,但无法记忆
- 将此布尔值传递给此函数的最有效方法是什么?
- 在函数内创建的对象的范围 - 如果在函数外部存储和访问引用,它们是否有效?
- 我如何知道作为参数的size_t在函数中是否有效?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 为什么TinyXML2的XMLDocument::FirstChild()函数在尝试解析这个有效的XML文件时返回NULL?
- 文本 RPG - 使用函数检查有效的输入
- 将 C 函数转换为 C++ 以检查数字是否有效
- 函数参数的名称与调用函数时使用的变量相同是否有效?
- 为什么使用不匹配的参数调用重载函数仍然有效
- 在函数中按值传递 unordered_map/unordered_set 是否有效? C++
- 我们如何并行运行算法的 n 个实例并以有效的方式计算结果函数的平均值?
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 为什么即使直接构造函数有效,template_back也会失败
- 不太清楚为什么我的递归链表删除函数有效?我很想解释一下
- 调用不带参数的构造函数有效,使用参数则无效。为什么?
- 为什么其中一个模板静态函数有效,而另一个不起作用
- 混合按引用传递和按值传递到可变参数模板函数有效
- 如何专门化模板类方法基于类型特征?使用std::enable_if对非类函数有效,但对类方法无效