使用结构作为成员函数的包装器
Using struct as wrapper for member function
我正在尝试使用结构作为 class 的成员函数的包装器。我有一个模板化结构,它应该包含一个指向成员函数的指针,但在一般意义上不指向实例的特定函数。我已经弄清楚了模板规范,但还没有弄清楚函数存储的语法。
更清楚:我有 class X
具有非静态函数 doY()
和 doZ()
。在我创建的 class class A
中,我有一个名为 ex
的 X
实例。根据情况我想调用其中一个函数。我制作了一个名为 wrapper
的结构。 Wrapper
应使用模板特化将对 doY()
或 doZ()
的引用存储在名为 function
的静态变量中。然后我应该可以调用 ex.wrapper::function
到 运行 ex.doY()
或 ex.doZ()
.
这是我的代码的当前版本(显示了一些 class 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
}
谢谢 molbdnilo,语法编译正确。
The pointer-to-member declaration syntax is return_type (class_name::variable_name)(parameter_types). The pointer-to-member dereferencing operators are . and ->*
从那时起,我还找到了一个同样有效的替代语法:
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;
我正在尝试使用结构作为 class 的成员函数的包装器。我有一个模板化结构,它应该包含一个指向成员函数的指针,但在一般意义上不指向实例的特定函数。我已经弄清楚了模板规范,但还没有弄清楚函数存储的语法。
更清楚:我有 class X
具有非静态函数 doY()
和 doZ()
。在我创建的 class class A
中,我有一个名为 ex
的 X
实例。根据情况我想调用其中一个函数。我制作了一个名为 wrapper
的结构。 Wrapper
应使用模板特化将对 doY()
或 doZ()
的引用存储在名为 function
的静态变量中。然后我应该可以调用 ex.wrapper::function
到 运行 ex.doY()
或 ex.doZ()
.
这是我的代码的当前版本(显示了一些 class 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
}
谢谢 molbdnilo,语法编译正确。
The pointer-to-member declaration syntax is return_type (class_name::variable_name)(parameter_types). The pointer-to-member dereferencing operators are . and ->*
从那时起,我还找到了一个同样有效的替代语法:
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;