我有一个类方法,它接收任何类的对象的函数指针,但具有特定的返回和参数列表。
问题是编译器返回我传递的内容与我正在使用的方法的参数不同
还有其他一些我遇到麻烦的事情,但我会在下面指出它们,并且一如既往,并不是每一个细节都在这里只有重要的事情。
Class.h :
template<typename Value, typename ...Args>
class thing <Value(Args...)>
{
/* moar code */
template<typename C>
void method(C* object, Value(C::*func)(Args...), Args... /*how do I pass all of the parameters from here*/)
{
(object->*fund)(/*then put the parameters in here*/);
/* Also would this work with or with out parameters being passed*/
/* this is then wrapped and stored to be used later */
}
}
在主要功能:
thing<void(int)> thingObj;
AClass obj(/*initialise if needed*/);
thingObj.method(&obj, &AClass::func, /*Parameters*/);
不使用boost / std :: function的原因是这是一个实验,所以我可以倾斜它是如何工作的 请原谅手机上的拼写错误和格式不足,将纠正错误并在我认为必要的地方添加细节
答案 0 :(得分:1)
您可以使用索引。
template<std::size_t...> struct seq{};
template<std::size_t N, std::size_t... Is>
struct gen_seq : gen_seq<N-1, N-1, Is...>{};
template<std::size_t... Is>
struct gen_seq<0, Is...> : seq<Is...>{};
然后像这样写
的方法重载template<typename C, size_t... indices>
void method(C* object, Value(C::*func)(Args...),
std::tuple<Args...>&& args, seq<indices...>)
{
(object->*func)(std::get<indices>(args)...);
}
并在第一种方法中调用它,如
method(object, func, std::forward_as_tuple(args...), gen_seq<sizeof...(Args)>{});
答案 1 :(得分:1)
这对我有用:
#include <iostream>
template <typename Signature>
class thing;
template <typename Value, typename... Args>
class thing <Value(Args...)>
{
public:
template<typename C>
void method(C* object, Value(C::*func)(Args...) const, Args&&... args)
{
(object->*func)(std::forward<Args>(args)...);
}
};
struct AClass
{
void func(int i) const
{
std::cout << "passed " << i << std::endl;
}
};
struct BClass
{
void add(double a, double b) const
{
std::cout << a << " + " << b << " = " << a + b << std::endl;
}
};
int main()
{
thing<void(int)> thingObj;
AClass obj;
thingObj.method(&obj, &AClass::func, 5);
BClass bobj;
thing<void(double, double)> anotherThing;
anotherThing.method(&bobj, &BClass::add, 10.2, 11);
}