[英]Cast unresolved template overloaded class member
我有一班有兩個重載成員。 一個使用整數,另一個是使用一個參數的模板函數。
class MyClass
{
public:
void doSomething(int data){ std::cerr << data;}
template <typename T> doSomething(T &&data){ std::cerr << data;}
};
我想綁定這個功能
MyClass myobject;
auto my_bind = std::bind(&MyClass::doSomething, &myobject, 2);
my_bind();
但這不會編譯,因為編譯器無法推斷出要調用的函數。
錯誤:沒有匹配的函數調用“ bind(未解析的重載函數類型,MyClass *,int)”
我知道我必須強制轉換該函數。
auto my_bind2 = std::bind(static_cast<void (MyClass::*)(int)>(&MyClass::doSomething), &myobject, 2);
現在,它可以按預期進行編譯和運行。
但是,如果我想將其與任何其他參數綁定以調用模板函數怎么辦? 這有可能嗎? 我找不到語法。
這不起作用:
auto my_bind3 = std::bind(static_cast<void (MyClass::*)(std::string)>(&MyClass::doSomething), &myobject, std::string("Hello"));
我想避免使用lambda。 我簡化了MCVE的代碼,但是在實際代碼中,我應該使用成員指針。
感謝您的幫助
您只需提供成員函數模板的相關實例的地址:
auto my_bind3 = std::bind(&MyClass::doSomething<std::string&>, &myobject, std::string("Hello"));
//Note the reference here ^^
上面的方法起作用是因為std::bind
復制其參數,並且由於doSomething
成員函數模板通過轉發引用接受其參數,因此我們需要利用引用折疊的優勢。
雖然下面的代碼片段會“綁定”,
auto my_bind3 = std::bind(&MyClass::doSomething<std::string>, &myobject, std::string("Hello"));
//Note the absence of a reference here ^^
當您最終調用my_bind3()
時,它將失敗。
如果您可以使用lambda,請使用它,因為完美的填充將開始。
auto my_bind4 = [&myobject](){ myobject.doSomething(std::string("\nHullo")); };
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.