最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

如何使用C++獲取指定的重載函數(shù)地址

 更新時(shí)間:2022年06月09日 10:53:14   作者:mkckr0  
重載函數(shù)是完全不同的幾個(gè)函數(shù),有不同的函數(shù)地址,下面這篇文章主要給大家介紹了關(guān)于如何使用C++獲取指定的重載函數(shù)地址的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

剛剛看到一篇博客,說 std::bind 無法綁定正確的重載函數(shù)。這里的問題并不是 std::bind 能力不足,而是將函數(shù)名傳遞給 std::bind 時(shí)編譯器無法取到這個(gè)函數(shù)的地址(也就是符號,編譯器會先解析成符號,鏈接器再替換為地址),因?yàn)橛卸鄠€(gè)重載函數(shù)都是這個(gè)名字。核心問題是無法通過函數(shù)名取到想要的重載函數(shù)地址。就像下面的代碼無法編譯通過:

#include <iostream>
void f()
{
    std::cout << "f 1" << std::endl;
}

void f(int x)
{
    std::cout << "f 2 " << x << std::endl;
}

int main()
{
    auto p = &f;
}

編譯錯(cuò)誤:

/home/abc/cpplearn/overload_func.cpp: In function ‘int main()’:
/home/abc/cpplearn/overload_func.cpp:15:15: error: unable to deduce ‘auto’ from ‘& f’
   15 |     auto p = &f;
      |               ^
/home/abc/cpplearn/overload_func.cpp:15:15: note:   couldn’t deduce template parameter ‘auto’

有沒有什么比較完美的解決辦法呢?我覺得一定有,因?yàn)?C 語言沒有函數(shù)重載,函數(shù)地址作為實(shí)參也是常規(guī)操作。相比之下,C++ 引入了函數(shù)重載,卻無法取到函數(shù)地址,這就很尷尬。C++ 設(shè)計(jì)者肯定也想到了這個(gè)問題。

于是查閱了 cppreference.com,看到了 Address of an overloaded function。函數(shù)名的重載解析除了發(fā)生在函數(shù)調(diào)用的時(shí)候,也會發(fā)生在以下 7 種語境:

#ContextTarget
1initializer in a declaration of an object or referencethe object or reference being initialized
2on the right-hand-side of an assignment expressionthe left-hand side of the assignment
3as a function call argumentthe function parameter
4as a user-defined operator argumentthe operator parameter
5the return statementthe return type of a function
6explicit cast or static_cast argumentthe target type of a cast
7non-type template argumentthe type of the template parameter

當(dāng)函數(shù)名存在于這 7 種語境時(shí),會發(fā)生重載解析,并且會選擇與 Target 類型匹配的那個(gè)重載函數(shù)。這里就不一一考察這 7 種語境了,有興趣可以自己查閱 cppreference.com。這里重點(diǎn)考察第 3 種和第 6 種。

先看第 3 種語境。當(dāng)函數(shù)名作為函數(shù)調(diào)用的實(shí)參時(shí),重載解析會選擇和形參類型相匹配的版本。也就是說,下面的代碼會如期運(yùn)行:

#include <iostream>
void f()
{
    std::cout << "f 1" << std::endl;
}

void f(int x)
{
    std::cout << "f 2 " << x << std::endl;
}

void call(void p(int)) {
    p(1);
}

int main()
{
    call(f);
}

這段代碼輸出:

f 2 1

回到最初的問題,std::bind 也是函數(shù),為什么無法正常編譯呢?直接分析下面代碼的編譯錯(cuò)誤信息:

#include <iostream>
#include <functional>

void f()
{
    std::cout << "f 1" << std::endl;
}

void f(int x)
{
    std::cout << "f 2 " << x << std::endl;
}

int main()
{
    auto new_func = std::bind(f, std::placeholders::_1);
    new_func(66);
}

編譯錯(cuò)誤:

/home/abc/cpplearn/overload_func.cpp: In function ‘int main()’:
/home/abc/cpplearn/overload_func.cpp:16:30: error: no matching function for call to ‘bind(<unresolved overloaded function type>, const std::_Placeholder<1>&)’
   16 |     auto new_func = std::bind(f, std::placeholders::_1);
      |                     ~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~

可以看到,std::bind 準(zhǔn)確地說是一個(gè)函數(shù)模板。它要根據(jù)其參數(shù)進(jìn)行模板實(shí)參推導(dǎo),再替換模板形參進(jìn)行實(shí)例化(Instantiation),產(chǎn)生和普通函數(shù)類似的匯編代碼。std::bind 進(jìn)行實(shí)例化的時(shí)候,函數(shù) f 還沒有進(jìn)行重載解析,其類型為<unresolved overloaded function type>。std::bind 無法進(jìn)行實(shí)例化。怎樣修改可以解決這個(gè)問題呢?

可以利用第 6 個(gè)語境,也就是顯示轉(zhuǎn)換或 static_cast。重載解析會選擇與它們的目標(biāo)類型相匹配的版本。下面的代碼會如期運(yùn)行:

#include <iostream>
#include <functional>

void f()
{
    std::cout << "f 1" << std::endl;
}

void f(int x)
{
    std::cout << "f 2 " << x << std::endl;
}

int main()
{
    auto new_func = std::bind((void(*)(int))f, std::placeholders::_1);
    new_func(66);
}

這段代碼輸出:

f 2 66

還有一種更加巧妙的辦法,依然是利用第 3 種語境。既然 std::bind 的第一個(gè)模板實(shí)參的推導(dǎo),和 f 的重載解析相矛盾。為什么不直接解決這個(gè)矛盾,將第一個(gè)模板實(shí)參改為顯示指定?來看下面的代碼:

#include <iostream>
#include <functional>

void f()
{
    std::cout << "f 1" << std::endl;
}

void f(int x)
{
    std::cout << "f 2 " << x << std::endl;
}

int main()
{
    auto new_func = std::bind<void(int)>(f, std::placeholders::_1);
    new_func(66);
}

這段代碼如期輸出:

f 2 66

總結(jié)

到此這篇關(guān)于如何使用C++獲取指定的重載函數(shù)地址的文章就介紹到這了,更多相關(guān)C++獲取重載函數(shù)地址內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++實(shí)現(xiàn)LeetCode( 69.求平方根)

    C++實(shí)現(xiàn)LeetCode( 69.求平方根)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode( 69.求平方根),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C++ COM編程之什么是接口?

    C++ COM編程之什么是接口?

    這篇文章主要介紹了C++ COM編程之什么是接口?在C++中,可以使用抽象基類來實(shí)現(xiàn)COM接口,需要的朋友可以參考下
    2014-10-10
  • Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用

    Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用

    本文主要介紹了Qt中關(guān)聯(lián)容器QMap,QMultiMap,QHash,QMultiHash的使用,這些關(guān)聯(lián)容器在Qt中提供了靈活而強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)選項(xiàng),根據(jù)具體的需求和使用場景,您可以選擇適合的容器來存儲和管理數(shù)據(jù),感興趣的可以了解一下
    2023-09-09
  • C++四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值

    C++四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值

    這篇文章主要介紹了C++的四種強(qiáng)制轉(zhuǎn)換原理與價(jià)值,文中介紹的非常詳細(xì),對學(xué)習(xí)C語言有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2023-04-04
  • c++ 端口掃描程序?qū)崿F(xiàn)案例

    c++ 端口掃描程序?qū)崿F(xiàn)案例

    下面小編就為大家?guī)硪黄猚++ 端口掃描程序?qū)崿F(xiàn)案例。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-05-05
  • C語言實(shí)現(xiàn)簡易掃雷游戲詳解

    C語言實(shí)現(xiàn)簡易掃雷游戲詳解

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡易掃雷游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • 關(guān)于vector的常見用法詳解

    關(guān)于vector的常見用法詳解

    這篇文章主要介紹了關(guān)于vector的常見用法詳解,vector本身可以作為數(shù)組使用,而且在一些元素個(gè)數(shù)不確定的場合可以很好地節(jié)省空間,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-02-02
  • C語言實(shí)現(xiàn)點(diǎn)菜系統(tǒng)

    C語言實(shí)現(xiàn)點(diǎn)菜系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)點(diǎn)菜系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • 適合初學(xué)者的C語言常量類型的講解

    適合初學(xué)者的C語言常量類型的講解

    常量是固定值,在程序執(zhí)行期間不會改變。這些固定的值,又叫做字面量。常量可以是任何的基本數(shù)據(jù)類型,比如整數(shù)常量、浮點(diǎn)常量、字符常量,或字符串字面值,也有枚舉常量。常量就像是常規(guī)的變量,只不過常量的值在定義后不能進(jìn)行修改
    2022-04-04
  • OpenCV實(shí)現(xiàn)幀間差分法詳解

    OpenCV實(shí)現(xiàn)幀間差分法詳解

    這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)幀間差分法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03

最新評論

江津市| 寿阳县| 龙州县| 大港区| 海城市| 建阳市| 万源市| 镇雄县| 丰原市| 兰溪市| 界首市| 大石桥市| 舞阳县| 盐津县| 防城港市| 佛山市| 休宁县| 平定县| 泊头市| 琼中| 张家港市| 营山县| 永胜县| 枣庄市| 芷江| 宣武区| 铁岭市| 棋牌| 宜宾县| 大庆市| 岐山县| 永安市| 故城县| 灵山县| 深州市| 松滋市| 遂昌县| 霞浦县| 石景山区| 县级市| 衡南县|