【发布时间】:2018-03-25 13:22:03
【问题描述】:
我正在尝试为模板类编写一个函数,该函数接受一个参数,该参数是大类私有数据中成员类的函数指针。当您调用该成员时,它会在较小的类上调用该函数。 (令人困惑的权利?)为了演示,我在这里有一个不工作的例子:
#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;
}
请注意,这不是我的实际代码,而是我正在尝试做的一个小例子。如您所见,我正在尝试调用MyClass 中的'Private' 的size 成员函数(我在此处将其公开以进行演示)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 模板,因此我们将不胜感激任何建议和帮助。
【问题讨论】:
标签: c++ templates function-pointers variadic-templates member-function-pointers