我试图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.
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)