我正在尝试编写一个模板类的函数,它接受一个参数,该参数是大类的私有数据中的成员类的函数指针。当你调用该成员时,它会在较小的类上调用该函数。 (?混淆右)为了证明,我这里有一个非工作例如:模板类中的模板variadic函数不会编译
#include <vector>
#include <iostream>
using namespace std;
template <typename T, typename C>
struct MyClass {
template <typename F, typename... A>
auto call_me(F func, A... args) { // pass in the function we want to call
return (mContainer.*func) (args...); // call the function supplied by
// the parameter on the private member data
}
C mContainer; // this will be private in my actual code
};
int main() {
MyClass<int, std::vector<int> > test;;
cout << test.call_me(&std::vector<int>::size) << endl; // works
test.call_me(&std::vector<int>::insert, test.mContainer.begin(), 4); // doesn't work
return 0;
}
请注意,这不是我的实际代码但我想要做的一个小例子。正如你所看到的,我正在试图呼叫size
“Private”的成员函数(我已经在此处公开示范)vector
MyClass
中的类。这只能每当我有没有参数编译器进行解包,但是当我尝试做插入功能(其参数解包),编译器给我的错误:
.\template.cpp: In function 'int main()':
.\template.cpp:24:71: error: no matching function for call to 'MyClass<int, std::vector<int> >::call_me(<unresolved overloaded function type>, std::vector<int>::iterator, int)'
test.call_me(&std::vector<int>::insert, test.mContainer.begin(), 4);
^
.\template.cpp:10:10: note: candidate: template<class F, class ... A> auto MyClass<T, C>::call_me(F, A ...) [with F = F; A = {A ...}; T = int; C = std::vector<int>]
auto call_me(F func, A... args) { // pass in the function we want to call
^~~~~~~
.\template.cpp:10:10: note: template argument deduction/substitution failed:
.\template.cpp:24:71: note: couldn't deduce template parameter 'F'
test.call_me(&std::vector<int>::insert, test.mContainer.begin(), 4);
这是相同的错误我得到了我的实际生产代码,调用variadic函数没有参数来解压缩工作,但如果我给予更多,我得到相同的错误信息。这是我第一次使用Variadic模板的真正尝试,所以任何建议和帮助将不胜感激。
我怎么会去这样做?谷歌搜索引导我使用static_cast,这不起作用。 'test.call_me(static_cast :: iterator,int)>(&std :: vector :: insert),test.mContainer.begin(),4);'。有没有其他方法可以做到这一点? –
Aryan
@Aryan我刚刚添加演员到答案 – NathanOliver
谢谢你,这工作。有没有更美丽的方式来做到这一点?或者使用较少按键的东西? – Aryan