簡體   English   中英

投射未解析的模板重載的類成員

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM