模板演绎

时间:2014-06-03 07:06:31

标签: c++ templates types

我有这种奇怪(对我来说)的行为,我无法解释,我希望对此有任何意见,请看下面的代码:

void detach(callback_function_ptr const& ptr) {
    observers.erase(remove_if(
        observers.begin(),
        observers.end(),
        [&ptr](callback_function_ptr const& ptr2) {
            return ptr.target<void(worker*)>() == ptr2.target<void(worker*)>();
        }
    ));
}

致电&#39;目标&#39;我需要指定我想要使用哪个,否则我得到这个编译错误:

test.cpp:47:44: error: no matching function for call to 'std::function<void(worker*)>::target() const'

这对我来说是可以理解的,我想我可以避免每次指定哪个&#39;目标&#39;我希望通过准备这样一个小帮手&#39;:

template<typename T>
worker_ptr get_target(const function<T>& callback) {
    return callback.target<T>();
}

这看起来是一个合理的解决方案(对我:)),但不起作用:

test.cpp: In member function 'void (worker::* worker::get_target(const std::func
tion<T>&))(worker*)':
test.cpp:18:27: error: expected primary-expression before '>' token
   return callback.target<T>();
                           ^
test.cpp:18:29: error: expected primary-expression before ')' token
   return callback.target<T>();
                             ^

嗯,在这里我没有发现问题,为什么无效?即使我使用void(worker *)而不是T,仍然存在编译错误:

test.cpp:18:26: error: expected primary-expression before 'void'
   return callback.target<void(worker*)>();
                          ^
test.cpp:18:26: error: expected ';' before 'void'
test.cpp:18:26: error: expected primary-expression before 'void'
test.cpp:18:26: error: expected ';' before 'void' 

我之前在分离&#39;之前使用过void(worker *)。功能没有问题,为什么这里不起作用?在这种情况下,如何完全表现模板类型推导和函数调用解析?

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

应该是(加上template):

template<typename T>
worker_ptr get_target(const function<T>& callback)
{
    return callback.template target<T>();
}