C++模板——根据参数编译成员函数
C++ template - compile member function based on arguments
假设 class 有一个成员函数,它应该接受一个双精度(双精度)函数或一个 class 实例与 "MyStructFunc" public 成员函数作为一个参数:
#include<functional>
#include <type_traits>
struct Caller
{
// (1.)
double call(std::function<double(double)> func) { return func(1); }
// (2.)
template<typename T>
double call(const T& S) { return S.MyStructFunc(2); }
};
因此,例如,我们可以通过
double myFunc(double x) { return x * x * x; }
或
struct myStruct
{
double MyStructFunc(double x) const { return x * x; }
};
像这样:
int main()
{
Caller c;
myStruct ms;
c.call(myFunc);
c.call(ms);
}
不幸的是,我得到一个错误。你能帮我让它工作吗?感谢您的帮助!
函数指针不是 std::function
,因此您的模板方法更匹配。
您可以使用 SFINAE 来限制您的模板方法:
// (2.)
template<typename T>
auto call(const T& S) -> decltype(S.MyStructFunc(2)) { return S.MyStructFunc(2); }
假设 class 有一个成员函数,它应该接受一个双精度(双精度)函数或一个 class 实例与 "MyStructFunc" public 成员函数作为一个参数:
#include<functional>
#include <type_traits>
struct Caller
{
// (1.)
double call(std::function<double(double)> func) { return func(1); }
// (2.)
template<typename T>
double call(const T& S) { return S.MyStructFunc(2); }
};
因此,例如,我们可以通过
double myFunc(double x) { return x * x * x; }
或
struct myStruct
{
double MyStructFunc(double x) const { return x * x; }
};
像这样:
int main()
{
Caller c;
myStruct ms;
c.call(myFunc);
c.call(ms);
}
不幸的是,我得到一个错误。你能帮我让它工作吗?感谢您的帮助!
函数指针不是 std::function
,因此您的模板方法更匹配。
您可以使用 SFINAE 来限制您的模板方法:
// (2.)
template<typename T>
auto call(const T& S) -> decltype(S.MyStructFunc(2)) { return S.MyStructFunc(2); }