第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

std :: function的模板參數(shù)(簽名)不是其類型的一部分嗎?

std :: function的模板參數(shù)(簽名)不是其類型的一部分嗎?

C++
達令說 2019-10-31 14:13:54
給定以下代碼,歧義背后的原因是什么?我可以規(guī)避它還是必須保留(煩人的)顯式演員表?#include <functional>using namespace std;int a(const function<int ()>& f){    return f();}int a(const function<int (int)>& f){    return f(0);}int x() { return 22; }int y(int) { return 44; }int main(){    a(x);  // Call is ambiguous.    a(y);  // Call is ambiguous.    a((function<int ()>)x);    // Works.    a((function<int (int)>)y); // Works.    return 0;}有趣的是,如果我將a()帶有function<int ()>參數(shù)的函數(shù)注釋掉并a(x)在main中調用,由于唯一可用函數(shù)之間的類型不匹配x以及參數(shù)不正確,編譯將正確失敗。如果在這種情況下編譯器失敗,那么當兩個函數(shù)同時存在時,為什么會有歧義?function<int (int)>a()a()我已經(jīng)嘗試使用VS2010和g ++ v。4.5。兩者都給我完全相同的歧義。
查看完整描述

3 回答

?
萬千封印

TA貢獻1891條經(jīng)驗 獲得超3個贊

這是一個如何包裝std::function一個類的示例,該類檢查其構造函數(shù)參數(shù)的可調用性:


template<typename> struct check_function;

template<typename R, typename... Args>

struct check_function<R(Args...)>: public std::function<R(Args...)> {

    template<typename T,

        class = typename std::enable_if<

            std::is_same<R, void>::value

            || std::is_convertible<

                decltype(std::declval<T>()(std::declval<Args>()...)),

                R>::value>::type>

        check_function(T &&t): std::function<R(Args...)>(std::forward<T>(t)) { }

};

像這樣使用:


int a(check_function<int ()> f) { return f(); }

int a(check_function<int (int)> f) { return f(0); }


int x() { return 22; }

int y(int) { return 44; }


int main() {

    a(x);

    a(y);

}

請注意,這與函數(shù)簽名上的重載并不完全相同,因為它將可轉換參數(shù)(和返回)類型視為等效。對于確切的重載,這應該起作用:


template<typename> struct check_function_exact;

template<typename R, typename... Args>

struct check_function_exact<R(Args...)>: public std::function<R(Args...)> {

    template<typename T,

        class = typename std::enable_if<

            std::is_convertible<T, R(*)(Args...)>::value>::type>

        check_function_exact(T &&t): std::function<R(Args...)>(std::forward<T>(t)) { }

};


查看完整回答
反對 回復 2019-10-31
  • 3 回答
  • 0 關注
  • 730 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號