通用包装器的功能,最后一个参数返回

我们已经写了大量的库函数,其原型C++大多是这样的:通用包装器的功能,最后一个参数返回

void my_fun(

const in_class & in_param_1,

const in_class & in_param_2,

const in_class & in_param_3,

out_class & out_param);

是否有包装这些功能,使下面就相当于一个通用的方法(假设out_param只写到my_fun):

out_class my_out; 

my_fun(my_in1,my_in2,my_in3,my_out);

out_class my_out = generic_wrapper(&my_fun,my_in1,my_in2,my_in3); 

如何写一个这样的generic_wrapper?如果这是可能的,那么也可以写入它,以便输入参数的数量是可变的,所以我可以用my_fun2来说,它可能需要4个in_param_'s?

回答:

考虑所有情况:

template<class T1, class Out> 

Out generic_wrapper(void (*f)(const T1 &, Out &), const T1 & t1) {

Out out;

f(t1,out);

return out;

}

template<class T1, class T2, class Out>

Out generic_wrapper(void (*f)(const T1 &, const T2 &, Out &), const T1 & t1, const T1 & t2) {

Out out;

f(t1,t2,out);

return out;

}

// .....

template<class T1, class T2, class T3, class T4, class T5, class Out>

Out generic_wrapper(void (*f)(const T1 &, const T2 &, const T3 &, const T4 &, const T5 &, Out &), const T1 & t1, const T1 & t2, const T3 & t3, const T4 & t4, const T5 & t5) {

Out out;

f(t1,t2,t3,t4,t5,out);

return out;

}

回答:

在C++ 0x中,我们也可以尝试使用可变参数模板:

template <class Out, class... Ins> 

Out generic_wrapper(void (*fun)(const Ins&... , Out&), const Ins&... ins)

{

Out out;

fun(ins..., out);

return out;

}

,但我不能用它W/O明确speficying模板ARGS(GCC 4.6 .1):

int main() 

{

in_class in;

out_class out1a = generic_wrapper(my_fun_1, in); // fails to compile...

out_class out1b = generic_wrapper<out_class, in_class>(my_fun_1, in); // works...

return 0;

}

回答:

使用C++ 11的可变参数模板,可以像这样实现包装:

template <class Func, class ...Args> 

typename last_argument_type<Func>::type wrapper(Func f, Args&& ...args)

{

typename last_argument_type<Func>::type result;

f(std::forward<Args>(args)..., result);

return result;

}

,我已经实现了last_argument_type为:在http://ideone.com/ef3zD

//typedefs last type in T... as type 

template <class ...T>

struct last_type;

template <class T, class ...U>

struct last_type<T, U...> { typedef typename last_type<U...>::type type; };

template <class T>

struct last_type<T> { typedef T type; };

//typedefs the type of the last argument of a function as type

//removes reference

//e.g void(int, float, double&) -> type = double

template <class ...Args>

struct last_argument_type;

template <class Ret, class ...Args>

struct last_argument_type<Ret(*)(Args...)> {

typedef typename std::remove_reference<typename last_type<Args...>::type>::type type;

};

完整的示例

以上是 通用包装器的功能,最后一个参数返回 的全部内容, 来源链接: utcz.com/qa/262767.html

回到顶部