【问题标题】:Using struct as wrapper for member function使用 struct 作为成员函数的包装器
【发布时间】:2019-05-02 17:51:24
【问题描述】:

我正在尝试将结构用作类成员函数的包装器。我有一个模板结构,它应该保存一个指向成员函数的指针,但在一般意义上不指向实例的特定函数。我已经弄清楚了模板规范,但还没有弄清楚函数存储的语法。

更清楚:我的类 X 具有非静态函数 doY()doZ()。在我创建的类A 中,我有一个名为exX 实例。根据情况我想调用其中一个函数。我制作了一个名为wrapper 的结构。 Wrapper 应该使用模板规范在名为function 的静态变量中存储对doY()doZ() 的引用。然后我应该可以调用ex.wrapper::function 来运行ex.doY()ex.doZ()

这是我的代码的当前版本(显示某些 B 类的特化),这会导致 func is not a member of wrapper 错误

.h

template <class T>
class A
{
    T timer;
    X ex;
    template<class Type>
    struct create_timer_getter{};

    void doSomething()
    {
        timer = ex.wrapper<T>::func();
    }
};

.cpp

template <>
struct A<B>::wrapper<B>
{
    // V-- this is where I am having issues --V
    static const X::(func)(int, int, char) = &X::doY
}

【问题讨论】:

  • 改用std::function有什么问题?
  • 它仍然只是给我一个function is not a member of wrapper 错误
  • 你在描述中使用了XAdoYdoZ,然后你去写代码你不使用这些名字的地方乙>。您将“XYZ”与“ABC”混合在完全不同的类别中(X 和 A 是类,Y 和 Z 是函数?)。您的示例代码是一个具有专业化和更多模板的模板,其中没有一个似乎与您的“更清晰”的描述清楚对应;您的“更清楚”不涉及模板。我认为您的问题很简单,但是您的问题令人困惑,我不再确定天空是否是蓝色的。您的代码中有...minimal reproducible example.
  • 指向成员的声明语法是return_type (class_name::*variable_name)(parameter_types)。指向成员的解引用运算符是.*-&gt;*
  • 仍然不是一个完整的例子。当我将此代码复制到文件中并编译它时,我得到 "error: 'X' does not name a type""error: 'B' was not declared in this scope" 和其他几个错误,没有一个与问题中提到的错误匹配。

标签: c++ templates struct function-pointers template-specialization


【解决方案1】:

谢谢 molbdnilo,语法编译正确。

指向成员的声明语法是 return_type (class_name::variable_name)(parameter_types)。指向成员的指针解引用运算符是 . 和 ->*

从那时起,我还发现了另一种也可以使用的语法:

typedef return_type (class_name::user_defined_type_name)(parameter_types);
user_defined_type_name variable_name = &namespace(if needed)::class_name::member_function_name;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-10
    相关资源
    最近更新 更多