当使用std :: unique_ptr定义的一元op时,term不会在std算法中求值为1

use*_*270 0 c++ stl c++11

我试图std::unique_ptr在std算法中使用仿函数,但如果我像这样使用它:

std::unique_ptr<IFormatter> format(new formatter("abcd"));
std::transform(vec.begin(), vec.end(), vec.begin(), *format.get()) 
Run Code Online (Sandbox Code Playgroud)

我收到编译错误说:

错误1错误C2064:term不评估为带有1个参数的函数.

完整程序如下:

#include <iostream>
#include <string>
#include<algorithm>
#include<vector>

using namespace std;

struct IFormatter
{
protected:
    std::string keyFormat;
    void fun(std::string& str)
    {
        // do something here.
    }
public:
    IFormatter(std::string keyFormat) : keyFormat(keyFormat) {}
    virtual std::string operator() (const std::string &key) = 0;
};

struct formatter : IFormatter
{
    formatter(std::string keyFormat) : IFormatter(keyFormat) {}
    std::string operator() (const std::string &key)
    {
            std::string s = keyFormat;
            fun(s);
            return s;
    }
};

int main()
{        
    std::vector<std::string> vec{ "one", "two" };
    std::unique_ptr<IFormatter> format(new formatter("$ID$"));
    // This line compiles fine if i define format as - formatter format("abcd");
    std::transform(vec.begin(), vec.end(), vec.begin(), format.get());
    start s;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:感谢所有的建议,但format.get()是一个错字,我正在使用*format.get()&我尝试过*格式(我同意不需要get().).使用std :: ref(*format)并不能解决问题.这很奇怪,但我仍然得到同样的错误.

PS如果重要我正在使用visual studio 2013.

T.C*_*.C. 6

std::transform(vec.begin(), vec.end(), vec.begin(), std::ref(*format));
Run Code Online (Sandbox Code Playgroud)

指针不可调用.但是你有一个指针到底座,所以std::ref要避免切片.


由于MSVC 2013 reference_wrapper 讨厌抽象类,所以使用lambda:

std::transform(vec.begin(), vec.end(), vec.begin(),
               [&](const std::string& s) { return (*format)(s); });
Run Code Online (Sandbox Code Playgroud)