一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

c – 如何使這些std :: function參數(shù)明確無誤?

 印度阿三17 2019-07-28

傳遞lambda時,以下函數(shù)重載是不明確的.我發(fā)現(xiàn)std :: function可以是constructed from most callable types,即使它們的簽名不匹配.所以編譯器無法分辨使用哪個函數(shù).

template <typename T> void each(std::function<void(T)> iterator);
template <typename T> void each(std::function<void(T, id)> iterator);
template <typename T> void each(std::function<void(T&)> iterator);
template <typename T> void each(std::function<void(T&, id)> iterator);

這里有一些類似的問題,但沒有一個能解決我的問題.如何在不改變用法的情況下解決歧義?更重要的是,當時我必須明確提到模板類型.有沒有解決的辦法?

解決方法:

其中一半是LWG issue 2132,從重載決策中刪除std :: function的構(gòu)造函數(shù),除非參數(shù)實際上可以為指定的參數(shù)類型調(diào)用.這需要表達SFINAE支持來實現(xiàn),VC沒有.

問題的另一半是重載解決:

#include<functional>
#include<iostream>
struct id {};
template <typename T> void each(std::function<void(T)> ){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
template <typename T> void each(std::function<void(T, id)> ){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
template <typename T> void each(std::function<void(T&)> ){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
template <typename T> void each(std::function<void(T&, id)> ){ std::cout << __PRETTY_FUNCTION__ << std::endl; }
int main() {
    each<int>([](int, id){});
}

有一個實現(xiàn)LWG2132,this code prints的庫,也許令人驚訝:

void each(std::function<void(T&, id)>) [with T = int]

為什么?首先,可以構(gòu)造一個std :: function< void(T&,id)>來自[](int,id){}.畢竟,后者可以使用類型為int的左值來調(diào)用.

第二,在

template <typename T> void each(std::function<void(T, id)>);
template <typename T> void each(std::function<void(T&, id)>);

第二種方法比功能模板的部分排序規(guī)則更專業(yè),因此總是通過重載分辨率來選擇.

一種可能的解決方案是通過操縱lambda的operator()的類型來提取簽名:

template<class T>
struct mem_fn_type;
template<class R, class C, class... T>
struct mem_fn_type<R(C::*)(T...)> {
    using type = std::function<R(T...)>;
};
template<class R, class C, class... T>
struct mem_fn_type<R(C::*)(T...) const> {
    using type = std::function<R(T...)>;
};

// optional extra cv-qualifier and ref-qualifier combos omitted
// since they will never be used with lambdas    

// Detects if a class is a specialization of std::function
template<class T>
struct is_std_function_specialization : std::false_type {};

template<class T>
struct is_std_function_specialization<std::function<T>> : std::true_type{};

// Constrained to not accept cases where T is a specialization of std::function,
// to prevent infinite recursion when a lambda with the wrong signature is passed
template<class T>
typename std::enable_if<!is_std_function_specialization<T>::value>::type each(T func) {
    typename mem_fn_type<decltype(&T::operator())>::type f = func;
    each(f);
}

這不適用于通用lambda(其operator()是模板)或任意函數(shù)對象(可能有任意多個operator()重載).

來源:https://www./content-4-363351.html

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    好吊一区二区三区在线看| 人妻乱近亲奸中文字幕| 人妻熟女欲求不满一区二区| 色婷婷视频免费在线观看| 日韩精品亚洲精品国产精品| 91欧美激情在线视频| 日本黄色美女日本黄色| 福利一区二区视频在线| 久久热这里只有精品视频| 欧美色欧美亚洲日在线| 亚洲av熟女国产一区二区三区站| 欧美区一区二区在线观看| 最新国产欧美精品91| 一区二区三区欧美高清| 日本办公室三级在线观看| 日韩欧美综合在线播放| 微拍一区二区三区福利| 国产一区日韩二区欧美| 国产精品丝袜美腿一区二区| 少妇人妻无一区二区三区| 精品香蕉一区二区在线| 操白丝女孩在线观看免费高清| 日韩欧美国产亚洲一区| 夫妻性生活真人动作视频| 欧美整片精品日韩综合| 99久久人妻精品免费一区| 亚洲欧美日本国产有色| 欧美又黑又粗大又硬又爽| 国产又大又黄又粗又免费| 亚洲国产欧美精品久久| 91欧美日韩中在线视频| 国产级别精品一区二区视频| 亚洲国产av在线观看一区| 中文字幕欧美精品人妻一区| 免费在线观看欧美喷水黄片| 中文字幕人妻日本一区二区| 国产又黄又猛又粗又爽的片| 五月天丁香亚洲综合网| 99久久精品午夜一区二| 高清一区二区三区四区五区| 国产一区二区不卡在线视频|