假设我们有一个原始的 C 风格字符串 "test"
。我们可以这样声明一个函数:
void printText(std::string textToPrint){
std::cout << textToPrint << "\n";
}
我们可以这样调用它:
printText("test");
这应该没问题,因为参数是一个对象,而不是引用,所以像 std::string("test")
这样的临时对象应该在调用函数 `printText 时创建()'.
既然如此,我就有了以下模板:
template <typename T>
T checkMe(Proxy<T> arg){
std::cout << arg() << std::endl;
return arg();
}
其中Proxy
类声明如下:
template <typename T>
class Proxy{
public:
Proxy(std::function<T&()> caller);
Proxy(std::shared_ptr<T> dataPtr);
T& operator()();
private:
std::function<T&()> m_functional;
std::shared_ptr<T> m_data;
};
它的目的是让一些函数被两种对象类型调用:
一个是数据的 shared_ptr
,另一个是返回此类数据的函数对象。
现在当我想调用函数checkMe
时发生错误,我不知道为什么会出现以及如何解决它。一件事是:
getMe(std::make_shared<int>(255));
在我看来这应该是完美的,因为 Proxy 的构造函数将 shared_ptr 作为参数并基于它创建自己。但这会导致编译器的推导错误。然而,当我这样调用函数时:
getMe<int>(std::make_shared<int>(255));
现在好了。我不知道为什么编译器无法自行推断类型。
第二种情况是用函数对象调用它:
getMe<int>(std::bind(getNumberMult,5,6));
其中getNumberMult
定义如下:
int xy;
int& getNumberMult(int x, int y){
return xy = x*y;
}
此处发生转换错误。有人可以指定是否有可能以及如何实现给定代码的预期行为并解释我对该机制的理解有什么问题?我想按如下方式使用此代码:
getMe(std::make_shared<int>(300));
getMe(std::bind(getNumberMult, 6, 7));
编译器错误:
使用时
getMe<int>(std::bind(getNumberMult, 5, 6));
path/to/file:36: error: C2664: 'T getMe<int>(DataProxy<T>)' : cannot convert argument 1 from 'std::_Bind<true,int &,int &(__cdecl *const )(int,int),int,int>' to 'DataProxy<int>'
with
[
T=int
]
最佳答案
与 T checkMe(Proxy<T> arg)
, arg
应该是 Proxy<T>
(或继承自它)。
编译器不会检查无限可能性来测试每个 Proxy<T>
可以从给定的参数构造。
关于C++自动构造函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33740612/