簡體   English   中英

使用模板別名結合模板的部分特化

[英]using template aliases combined with partial specialization of templates

我正在思考為什么以下會導致編譯錯誤。 我是元編程的新手,但根據我對 SFINAE 原理的理解,以下函數是相互排斥的,因此它不是對現有函數的“重新定義”。

#include <type_traits>

template<typename T>
using IsNotEnum = typename std::enable_if<!std::is_enum<T>::value>::type;

template<typename T>
using IsEnum = typename std::enable_if<std::is_enum<T>::value>::type;

template<typename T, typename = IsNotEnum<T>>
void doSomething()
{
}

template<typename T, typename = IsEnum<T>>
void doSomething()
{
}

g++ 7.5 抱怨以下內容:

error: redefinition of ‘template<class T, class> void doSomething()’
void doSomething()
  ^~~~~~~~~~~
note: ‘template<class T, class> void doSomething()’ previously declared here
void doSomething()

嘗試按如下方式重寫您的函數

template<typename T, IsNotEnum<T> = nullptr>
void doSomething()
{
}

template<typename T, IsEnum<T> = nullptr>
void doSomething()
{
}

和您的using s 如下

template <typename T>
using IsNotEnum = typename std::enable_if<!std::is_enum<T>::value, std::nullptr_t>::type;

template <typename T>
using IsEnum = typename std::enable_if<std::is_enum<T>::value, std::nullptr_t>::type;

或者簡單地說,如果你有一個 C++14 或更新的編譯器,

template <typename T>
using IsNotEnum = std::enable_if_t<!std::is_enum<T>::value, std::nullptr_t>;

template <typename T>
using IsEnum = std::enable_if_t<std::is_enum<T>::value, std::nullptr_t>;

您的代碼中的問題是您不能編寫兩個不同的函數,這些函數僅針對模板默認類型/值有所不同。

因此,刪除默認值后,SFINAE 不會禁用不需要的功能。 所以你有一個函數沖突。

僅刪除類型(在等號左側)SFINAE 刪除不需要的功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM