簡體   English   中英

具有std :: enable_if和具體類型的模板類專門化

[英]Template class specialization with std::enable_if and a concrete type

我有JsonFormatter模板類,它通過以下方式專門用於不同類型,例如算術等。

template <class T, typename Enable = void>
class JsonFormatter;

template <class T>
class JsonFormatter<T, typename std::enable_if<std::is_arithmetic<T>::value>::type>
{
};

目前尚不清楚如何將其專用於例如std::string類的具體類型? 我的第一個想法是這樣的:

template <>
class JsonFormatter<std::string, std::true_type>
{
};

但這無法編譯。 當我使用

JsonFormatter<std::string>

我懂了

"undefined class 'JsonFormatter<std::string,void>'"

重要的一點是,專業化必須與主要匹配。 在這種情況下,主要對象的設置應使第2個模板參數將為void -用戶不打算提供它,而是在那里使人們能夠使用enable_if

std::true_type不匹配void ,這就是為什么它不起作用的原因。 當用戶寫JsonFormatter<std::string>默認的參數將被實例為void -所以他們正在尋找的專業化JsonFormatter<std::string, void> ...這是不是你提供了什么。

你要:

template <>
class JsonFormatter<std::string, void>
{ };

甚至只是:

template <>
class JsonFormatter<std::string>
{ };

由於默認參數將被填充就好了。

這是您專門化模板的方式:

template <>
class JsonFormatter<std::string, void>
{
};

您也可以使用std::enable_if ,但我不建議您這樣做,因為簡單的專業化要容易得多。 std::enable_if僅適用於SFINAE 因此,它需要依賴於模板參數:

template <class T>
class JsonFormatter<T, std::enable_if_t<std::is_same_v<T, std::string>>>
{
};

目前尚不清楚如何將其專用於例如std::string類的具體類型?

您是否嘗試過簡單地

template <>
class JsonFormatter<std::string>
{
};

應該可以。

根據主版本中定義的dafault值,第二個模板參數將變為void

暫無
暫無

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

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