c++ - 在 std::function 中使用模板参数

标签 c++ templates

我有一个模板化函数,它根据调用者指定的算法选择 vector 或列表元素:

template<typename It>
void Foo(It begin, It end, std::function<It(It, It)> GetElement)
{
    It element = GetElement(begin, end);
}

如何使用 lambda 表达式调用此函数?

我的第一个方法是

Foo(v.begin(), 
    v.end(), 
    [v](? , ? ) {return v.begin(); });

但是我很明显地卡在了参数部分,用问号表示...

最佳答案

C++11:

Foo(v.begin(), 
    v.end(), 
    [v](decltype(v.begin()) a, decltype(v.begin()) b) { return v.begin(); });

C++14:

Foo(v.begin(), 
    v.end(), 
    [v](auto a, auto b) { return v.begin(); });

如果您不关心参数 ab,您可以使用:[v](auto...){ return v。开始(); } 而不是 skypjack 在评论中的建议。


此外,我建议将 lambda 作为模板参数传递除非您有充分的理由使用 std::function:

template<typename It, typename F>
void Foo(It begin, It end, F&& GetElement)
{
    It element = GetElement(begin, end);
}

我写了一篇与主题相关的文章:
"Passing functions to functions"

它包含一些基准测试,显示与模板参数和其他解决方案相比,std::function 生成了多少程序集。

关于c++ - 在 std::function 中使用模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42856070/

相关文章:

c++ - 使用模板在编译时初始化数组指针的 const vector

c++ - 模板函数的简单脚本引擎模板数据类型

C++:传递具有任意数量参数的函数作为参数

java - 如何从 C++/JNI 调用带有 Android 上下文参数的 Java 方法

c++ - 显示不太冗长的函数参数 - Visual Studio

c++ - 在两个线程中设置两个鼠标钩子(Hook)

C++ - 模板嵌套类的引用初始化无效

c++ - 按位运算符,不是 vs xor 在分支中使用

c++ - 使用 map<int, Foo> 而不是 vector<Foo> 来避免指针失效

javascript - Grunt 读取模板中的替换文件