亚洲mv大片欧洲mv大片入口,国产粉嫩无码一区二区三区,国内精品自产拍在线观看91,久久久亚洲欧洲日产国码二区,中文字幕人妻久久一区二区三区

常州機(jī)器視覺培訓(xùn)

常州上位機(jī)軟件開發(fā)

常州工業(yè)機(jī)器人編程設(shè)計培訓(xùn)

常州PLC培訓(xùn)

常州PLC

常州PLC編程培訓(xùn)

常州電工培訓(xùn)

常州和訊plc培訓(xùn)中心歡迎您!
當(dāng)前位置:網(wǎng)站首頁 > 技術(shù)資料 技術(shù)資料
C++代碼-上位機(jī)培訓(xùn)-工業(yè)機(jī)器人培訓(xùn)
日期:2023-4-26 15:56:16人氣:  標(biāo)簽:常州上位機(jī)培訓(xùn)-常州工業(yè)機(jī)器人培訓(xùn)

C++代碼


/** When this Future has completed, execute func which is a function that

    takes one of:

      (const) Try<T>&&

      (const) Try<T>&

      (const) Try<T>

      (const) T&&

      (const) T&

      (const) T

      (void)


    Func shall return either another Future or a value.

    A Future for the return type of func is returned.

    Future<string> f2 = f1.then([](Try<T>&&) { return string("foo"); });


    The Future given to the functor is ready, and the functor may call

    value(), which may rethrow if this has captured an exception. If func

    throws, the exception will be captured in the Future that is returned.

    */

  template <

      typename F,

      typename FF = typename detail::FunctionReferenceToPointer<F>::type,

      typename R = detail::callableResult<T, FF>>

  typename R::Return then(F&& func) {

    typedef typename R::Arg Arguments;

    return thenImplementation<FF, R>(std::forward<FF>(func), Arguments());

  }

大林上位機(jī)機(jī)器視覺,_常州電工培訓(xùn)_常州PLC培訓(xùn)_常州機(jī)器視覺培訓(xùn)_常州上位機(jī)培訓(xùn)_常州工業(yè)機(jī)器人培訓(xùn),最適合電工及plc編程人員學(xué)習(xí)的上位機(jī)機(jī)器視覺課程 大林老師:15861139266(微信同號)


template<typename F, typename... Args>

struct callableWith {

    template<typename T,

             typename = detail::resultOf<T, Args...>>

    static constexpr std::true_type

    check(std::nullptr_t) { return std::true_type{}; };


    template<typename>

    static constexpr std::false_type

    check(...) { return std::false_type{}; };


    typedef decltype(check<F>(nullptr)) type;

    static constexpr bool value = type::value;

};


template<typename T, typename F>

struct callableResult {

  typedef typename std::conditional<

    callableWith<F>::value,

    detail::argResult<false, F>,

    typename std::conditional<

      callableWith<F, T&&>::value,

      detail::argResult<false, F, T&&>,

      typename std::conditional<

        callableWith<F, T&>::value,

        detail::argResult<false, F, T&>,

        typename std::conditional<

          callableWith<F, Try<T>&&>::value,

          detail::argResult<true, F, Try<T>&&>,

          detail::argResult<true, F, Try<T>&>>::type>::type>::type>::type Arg;

  typedef isFuture<typename Arg::Result> ReturnsFuture;

  typedef Future<typename ReturnsFuture::Inner> Return;

};


template<typename F, typename... Args>

using resultOf = decltype(std::declval<F>()(std::declval<Args>()...));


這里一大波template我們一個一個來。FunctionReferenceToPointer可以無視掉,你可以想象成FF就是Fstd::declval 讓你把 F變成 F&&,所以可以用template<typename F, typename... Args>

using resultOf = decltype(std::declval<F>()(std::declval<Args>()...));

這樣的語法拿到F(Args args...) 的返回值,不管F是object還是lambda。這樣,resultOf可以拿到我們的callback的返回type。現(xiàn)在我們得把這個返回值跟下一個函數(shù)的argument對應(yīng)起來。這里我們用callableWithtemplate<typename F, typename... Args>

struct callableWith {

    template<typename T,

             typename = detail::resultOf<T, Args...>>

    static constexpr std::true_type

    check(std::nullptr_t) { return std::true_type{}; };


    template<typename>

    static constexpr std::false_type

    check(...) { return std::false_type{}; };


    typedef decltype(check<F>(nullptr)) type;

    static constexpr bool value = type::value;

};

這里check有兩個specialization,一個在編譯時候會返回true一個會返回false。注意只要不符合第一個specialization的都是false,也就是說resultOf沒有成功,check(nullptr) 就是false type。這個技巧叫做Substitution Failure Is Not An Error SFINAE - cppreference.com 。再配倒數(shù)第二行的typedef,如果 F可以接受args,那么callableWith<F>(Args args...)::value == true type。最后,把所有我們允許的類用std::conditional一個一個試過去template<typename T, typename F>

struct callableResult {

  typedef typename std::conditional<

    callableWith<F>::value,

    detail::argResult<false, F>,

    typename std::conditional<

      callableWith<F, T&&>::value,

      detail::argResult<false, F, T&&>,

      typename std::conditional<

        callableWith<F, T&>::value,

        detail::argResult<false, F, T&>,

        typename std::conditional<

          callableWith<F, Try<T>&&>::value,

          detail::argResult<true, F, Try<T>&&>,

          detail::argResult<true, F, Try<T>&>>::type>::type>::type>::type Arg;

  typedef isFuture<typename Arg::Result> ReturnsFuture;

  typedef Future<typename ReturnsFuture::Inner> Return;

};




本文網(wǎng)址:

相關(guān)信息:
  • 沒有資料
版權(quán)所有 CopyRight 2006-2017 江蘇和訊自動化設(shè)備有限公司 常州自動化培訓(xùn)中心 電話:0519-85602926 地址:常州市新北區(qū)府琛商務(wù)廣場2號樓1409室
蘇ICP備14016686號-2 技術(shù)支持:常州山水網(wǎng)絡(luò)
本站關(guān)鍵詞:常州PLC培訓(xùn) 常州PLC編程培訓(xùn) 常州PLC編程 常州PLC培訓(xùn)班 網(wǎng)站地圖 網(wǎng)站標(biāo)簽
在線與我們?nèi)〉寐?lián)系
亚洲mv大片欧洲mv大片入口,国产粉嫩无码一区二区三区,国内精品自产拍在线观看91,久久久亚洲欧洲日产国码二区,中文字幕人妻久久一区二区三区