我正試圖為我的std::unique_ptr撰寫一個洗掉器,我想多載洗掉的方法。以下是我所嘗試的,但是編譯器抱怨說使用了std::enable_if_t。代碼是用-std=c 20標記編譯的。
template <class T>
class custom_deleter
{
public:
template <class U, std:: enable_if_t<std::is_array_v<T>, bool> = true>
void operator()(U* ptr) { std::cout << "array"/span>; }
template <class U, std::enable_if_t< ! std::is_array_v<T>, bool> = true>
};
下面是編譯器的錯誤:
main. cpp:17:10: error: no type named 'type' in 'struct std::enable_if<false, bool> '
17 | void operator()(U* ptr){ std: :cout << "非陣列"/span>; }
| ^~~~~~~~
我不明白這個問題。起初,我以為我缺少一個包含的或編譯的標志,以便std::enable_if_t可用,但它不是這里的問題。感謝任何幫助。
uj5u.com熱心網友回復:
SFINAE需要一個被依賴的函式的模板引數。這意味著std::enable_if_t只能應用于U而不能應用于類模板T。因此,你需要在你的operator()s中以某種方式包含模板引數T(比如class U = T)或者直接if constexpr的operator(),因為你反正是可以訪問c 20 :
template <class T>
class custom_deleter
{
public:
template <class U = T>
void operator() (U* ptr)
{
if constexpr(std::is_array_v<U>) std::cout << "array"/span>;
else if constexpr(!std::is_array_v<U>) std::cout << "非array";
}
};
int main()
{
custom_deleter<int[2]> arrDel;
custom_deleter<std::string> strDel;
return 0;
}
uj5u.com熱心網友回復:
SFINAE在選擇呼叫什么函式時啟動了,但你的條件只取決于T而不是U。其實不知道這是不是正確的解釋,sfinae讓我頭暈目眩:P。由于你使用的是C 20,我建議使用constexpr if而不是SFINAE。不管怎么說,這樣編譯:
template <class T>
class custom_deleter
{
public:
template <class U,class W=T, std: :enable_if_t<! std::is_array_v<W>, bool> = true>
void operator()(U* ptr) { std::cout << "非陣列"; }
template <class U,class W=T, std: :enable_if_t<std::is_array_v<W>, bool> = true>
void operator()(U* ptr) { std::cout << "array"; }; ; "array"; "array"; ; int main(){
custom_deleter<int> p{};
p("asd"/span>)。
轉念一想...為什么會有U和T?難道你不想要一個custom_deleter<T>來洗掉Ts? 我想你實際上是想這樣做的:
template <class T>
class custom_deleter
{
public:
template <class U=T, std::enable_if_t< ! std::is_array_v<U>, bool> = true>
void operator()(U* ptr) { std::cout << "非陣列"; }
template <class U=T, std:: enable_if_t<std::is_array_v<U>, bool> = true>
void operator()(U* ptr) { std::cout << "array"; }; ; "array"; "array".
};
int main(){
custom_deleter<int> p{};
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/315762.html
標籤:
上一篇:洗掉CMD中變數的逗號
