c++ - 检索对象的函数运算符的参数类型

标签 c++ templates function-pointers c++03

我有一个包装器,它将采用多个参数的函数转换为仅采用单个参数的函数(提供了其他参数的值)。此代码适用于函数:

template <class R, class F, class A0, class A1>
class CMyWrapper {
     F m_f;
     A0 m_default_a0;

public:
     CMyWrapper(F f, const A0 &default_a0)
         :m_f(f), m_default_a0(default_a0)
     {}

     R operator ()(const A1 &a1) const
     {
         return m_f(m_default_a0, a1);
     }
};

template <class R, class A0, class A1>
CMyWrapper<R, R (*)(const A0&, const A1&), A0, A1>
    SupplyConstArg(R (*fun)(const A0&, const A1&), const A0 &default_a0)
{
    return CMyWrapper<R, R (*)(const A0&, const A1&), A0, A1>(fun, default_a0);
}

double MyFunc(const double &x, const double &y); // some function

所以现在我可以做例如SupplyConstArg(MyFunc, 1.23)(4.56) 调用 MyFunc(1.23, 4.56) (该表达式的左侧部分是一个提供常量第一个参数的函数对象)。到目前为止一切顺利。

但是,我在编写适用于函数对象而不是函数的类似函数时遇到了一些困难(出于性能原因,我希望尽可能避免使用函数指针)。假设:

struct CMyFunObj {
    double operator ()(const double &x, const double &y);
};

我的问题是给定此类函数对象的实例,如何匹配返回类型或参数类型?到目前为止,我想出了:

template <class F, class R, class A0, class A1>
R Infer(F f, R (F::*fun)(const A0 &a0, const A1 &a1) = &F::operator ());

哪种方法有效,但前提是还指定了第二个参数,例如通过调用:

Infer(CMyFunObj(), &CMyFunObj::operator ());

但如果我省略第二个参数并依赖默认值则不会。有什么想法如何在 C++03 中做到这一点吗?

最佳答案

在 C++03 中,您无法真正推断出这样的类型(除非您想使用类似 typeof),因此您必须实际提供它:

struct CMyFunObj {
    typedef double result_type;
    double operator()(const double &x, const double &y);
};

现在您可以使用额外的信息:

template <class F, class A0>
CMyWrapper<typename F::result_type, F, A0>
SupplyConstArg(F f, A0 const& a0) {
    return CMyWrapper<typename F::result_type, F, A0>(f, a0);
}

SupplyConstArg(CMyFunObj(), 4.0)(5.0);

您不需要 CMyWrapper 中的类型 A1,它可以是其 operator() 上的模板参数。

关于c++ - 检索对象的函数运算符的参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39616058/

相关文章:

c++在给定类中创建函数指针 vector ,函数是不同类的成员

c++ - 如何使用指向静态成员函数的函数指针作为模板参数?

c++ - 将数组传递给函数并返回指针

c++ - C++ 中纯虚拟容器接口(interface)的迭代器

c++ - 为什么看起来我的对象被销毁了两次?

c++ - 专门化模板函数以生成编译时错误

templates - 使用 api 获取 wiki 页面的模板数据

c++ - 平台工具集 v140 和 v140_xp 有什么区别?

c++ - 模板相关的名称解析不应该找到没有链接的声明?

c - 这个C代码片段是什么意思?