【发布时间】:2019-05-02 17:51:24
【问题描述】:
我正在尝试将结构用作类成员函数的包装器。我有一个模板结构,它应该保存一个指向成员函数的指针,但在一般意义上不指向实例的特定函数。我已经弄清楚了模板规范,但还没有弄清楚函数存储的语法。
更清楚:我的类 X 具有非静态函数 doY() 和 doZ()。在我创建的类A 中,我有一个名为ex 的X 实例。根据情况我想调用其中一个函数。我制作了一个名为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错误 -
你在描述中使用了
X和A和doY和doZ,然后你去写代码你不使用这些名字的地方乙>。您将“XYZ”与“ABC”混合在完全不同的类别中(X 和 A 是类,Y 和 Z 是函数?)。您的示例代码是一个具有专业化和更多模板的模板,其中没有一个似乎与您的“更清晰”的描述清楚对应;您的“更清楚”不涉及模板。我认为您的问题很简单,但是您的问题令人困惑,我不再确定天空是否是蓝色的。您的代码中有...。 minimal reproducible example. -
指向成员的声明语法是
return_type (class_name::*variable_name)(parameter_types)。指向成员的解引用运算符是.*和->*。 -
仍然不是一个完整的例子。当我将此代码复制到文件中并编译它时,我得到 "error: 'X' does not name a type" 和 "error: 'B' was not declared in this scope" 和其他几个错误,没有一个与问题中提到的错误匹配。
标签: c++ templates struct function-pointers template-specialization