繁体   English   中英

使用成员函数指针作为参数的可变参数模板

[英]Variadic template with member function pointer as parameter

我在线观看了几个例子,我不明白为什么这不能编译..我想要做的是将类Object的成员函数传递给一个具有所述Objects的向量的类,并且具有模板化参数的函数作为参数被调用...示例:

template <typename ...Args_t>
bool objectsDo(bool (Object::*func)(Args_t...), Args_t&&... args) {
    for (int i = 0 ; i < OBJECTS ; ++i) {
        if (!m_objects[i]->*func(std::forward<Args_t>(args)...)) {
            return false;
        }
    }
    return true;
}

但我尝试的每一个功能,甚至是无参数的功能:

error: no instance of function template "objectsDo" matches the argument list
            argument types are: (bool ())
                objectsDo(&Object::close);

我的用法是:

            objectsDo(&Object::close);

编辑:正如Columbo所建议的,我现在正在向函数发送地址,但在使用参数发送时仍然会出错,例如:

  error: no instance of function template "objectsDo" matches the argument list
            argument types are: (bool (Object::*)(int, char), int, char)

我假设您调用这样的函数:

int main()
{
    int i; char c;
    objectsDo(&Object::close, i, c);
}

问题是随后推断出模板参数:

template <typename ...Args_t>
bool objectsDo(bool (Object::*func)(Args_t...), Args_t&&... args)

Args_t推导为int, char第一个参数为int&, char& ,第二个为int&, char& 这是因为通用引用的内部工作:它与参考折叠一起使用。

使用另一个参数包作为尾随参数:

template <typename ...Args_t, typename... Args>
bool objectsDo(bool (Object::*func)(Args_t...), Args&&... args)
{ /* […] */ }

或者将尾随参数设为非推导上下文:

template <typename T> struct identity {using type = T;};
template <typename T>
using identity_t = typename identity<T>::type;

template <typename ...Args_t>
bool objectsDo(bool (Object::*func)(Args_t...), identity_t<Args_t>... args){
    // […]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM