我有下一个代码:
object a,b,c;
fun (a);
fun (b);
fun (c);
我想知道是否有任何方法可以在C ++ 98或C ++ 11中执行类似的操作:
call_fun_with (fun, a, b, c);
由于
答案 0 :(得分:7)
这是一个可变参数模板解决方案。
#include <iostream>
template < typename f_>
void fun( f_&& f ) {}
template < typename f_, typename head_, typename... args_>
void fun( f_ f, head_&& head, args_&&... args) {
f( std::forward<head_>(head) );
fun( std::forward<f_>(f), std::forward<args_>(args)... );
}
void foo( int v ) {
std::cout << v << " ";
}
int main() {
int a{1}, b{2}, c{3};
fun(foo, a, b, c );
}
答案 1 :(得分:6)
您可以使用variadic模板使用以下内容:
template <typename F, typename...Ts>
void fun(F f, Ts&&...args)
{
int dummy[] = {0, (f(std::forward<Ts>(args)), 0)...};
static_cast<void>(dummy); // remove warning for unused variable
}
或在C ++ 17中,带有折叠表达式:
template <typename F, typename...Ts>
void fun(F&& f, Ts&&...args)
{
(static_cast<void>(f(std::forward<Ts>(args))), ...);
}
现在,测试一下:
void foo(int value) { std::cout << value << " "; }
int main(int argc, char *argv[])
{
fun(foo, 42, 53, 65);
return 0;
}
答案 2 :(得分:5)
使用C ++ 11,你可以这样使用std::function
(编写IMO非常快)
void call_fun_with(std::function<void(int)> fun, std::vector<int>& args){
for(int& arg : args){
fun(arg);
}
}
或者,更通用一点:
template<typename FTYPE>
void call_fun_with(FTYPE fun, std::vector<int>& args){
for(int& arg : args){
fun(arg);
}
}
Live example, templated version
注意:必须按以下方式指定std::function
模板参数:return_type(arg1_type, arg2_type,etc.)
编辑:替代方案可能是使用std::for_each
实际上做了几乎相同的事情,但我不喜欢语义,这更像是“为了一切在这个容器中,做......“。但那只是我和我(也许是愚蠢的)编码方式:)。
答案 3 :(得分:1)
有很多不同的方式...
#include <iostream>
#include <vector>
#include <algorithm>
void foo(int x) {
std::cout << x << "\n";
}
void call_fun_with(std::function<void(int)> fn, std::vector<int> lst) {
for(auto it : lst)
fn(it);
}
int main() {
std::vector<int> val = {1,2,3,4,5};
// c++98
std::for_each(val.begin(), val.end(), foo);
// c++11
// vector
call_fun_with(foo, val);
// c++11
// initializer_list
int a=0, b=1, c=2;
call_fun_with(foo, {a,b,c});
}
请参阅here。
答案 4 :(得分:1)
基于C ++ 11范围(增强)的for循环会将 braced-init-list 识别为initializer_list
,这意味着可以进行以下操作:>
for (auto &x : {a,b,c}) fun(x);