sfinae

    1熱度

    1回答

    我想使用enable_if來爲某些類型定義一個類。在這些類型中,我需要使用一些模板類型,並且我無法使其工作。這裏是一個MWE: 模板類A: template<typename T, typename Enable = void> class A; 其專門爲一些簡單的類型,如整型這裏,可以定義如下: template<typename T> class A<T, std::enable_if<

    2熱度

    4回答

    在一個類中,我有兩種不同的方法,根據調用者模板參數應該是相互排斥的。 class Foo { // For collections template<class T> typename boost::enable_if<boost::is_same<typename std::vector<typename T::value_type>, T>::value, co

    9熱度

    2回答

    在C++中17,我們有std::void_t,這使得SFINAE看起來要好很多: template <typename T> std::void_t<decltype(T::prop)> foo() { /* stuff */ } 模板功能將只存在,如果存在T::prop。 如果T::prop存在,模板功能foo()將是相同的: template <typename T> void foo

    8熱度

    1回答

    我有一個庫,其中包含幾個函數對象,根據std::is_integral只能接受幾種類型的函數對象。當條件失敗時,我想要std::is_invocable返回false,但是當用戶試圖調用函數對象的實例時,我也希望有一個不錯的static_assert錯誤消息。下面是函數對象的簡單例子,我現在有: struct function { template<typename Iterator>

    1熱度

    1回答

    我想在編譯時將函數的模板類型限制爲特定的類及其子類。要做到這一點,我使用的類型性狀std::enable_if_t和std::is_base_of這樣的: template <typename T = std::enable_if_t<std::is_base_of<A, T> > > 但仍然模板與不繼承層次結構(即int)的一部分類型的編譯。下面是該問題的MCVE: class A { p

    1熱度

    1回答

    我是SFINAE的新手。我注意到: template <typename T> void f(T t) { t.Crash(); } // version 1 void f(...) { } // The sink. f(1); template <typename T> void f(const T& t, typename T::iterator* it = nullptr) { }

    2熱度

    1回答

    請考慮以下情況,我想檢查我傳遞給其他某個函數的類型sf是否具有sf所需的成員函數T::mf,我知道返回類型和名稱,但可以有任何數量的重載。 經過一些修補(好吧很有趣..)和谷歌搜索,我可以得到像下面的代碼工作,問題是我不知道如何表示print可以有可變數量的參數。 #include <type_traits> #include <utility> template <typename T,

    8熱度

    1回答

    後續的代碼不能編譯,因爲結構A不支持--操作。 struct A {}; struct B { void Run() {} A& Dec(A& a) { return --a; } }; int main(int argc, char** argv) { B b; b.Run(); } 與此密碼相同。 struct A {}; templ

    0熱度

    1回答

    我有一個類,它包裝一個枚舉併爲其提供字符串轉換。現在我介紹了模板參數'fastStringConvert',它控制着如何使用SFINAE進行轉換(在這裏找到:how can I use std::enable_if in a conversion operator?)。代碼在MSVC下編譯,但在GCC和Clang下失敗。 error: no type named ‘type’ in ‘struct

    1熱度

    1回答

    我想根據給定的枚舉模板參數(store_type)選擇一個類模板。現在我實例化一個使用這個類的類,但它似乎總是嘗試實例化這個類的basic_store。 enum store_type { none, basic, lockless, }; template<class T, store_type S = none, typename = void> str