[英]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.