[英]How to use std::enable_if with variadic template
我正在嘗試創建一個Tensor類(對於那些不知道這與多維數組在數學上等效的類),並且我只希望在使用滿足某些類型特征的類型實例化時才允許對其進行編譯。
通常,我會做類似的事情:
template <typename T, std::size_t Size, typename Enable = void>
class Foo;
// Only allow instantiation of trivial types:
template <typename T, std::size_t Size>
class Foo<T, Size, typename std::enable_if<std::is_trivial<T>::value>::type>
{
// Implement stuff...
};
但是,我需要未知數量的模板參數來指定張量對象的每個維度的范圍,如下所示:
template <typename T, std::size_t... Sizes, typename Enable = void>
class CTensor;
template <typename T, std::size_t Sizes>
class CTensor<T, Sizes..., typename std::enable_if<std::is_trivial<T>::value>::type>
{
// Implement stuff...
};
但是,由於可變參數模板參數Sizes...
,因此無法使用。 我希望能夠實例化CTensor
對象,如下所示:
CTensor<int, 3, 4, 5> testTensor; // Compiles fine and produces a rank 3 tensor
CTensor<ComplexClass, 3, 4, 5> testTensor2; // Produces a compile-time error
實現此目標的最佳方法是什么?
為什么要在類上使用enable_if
? 目的是使函數在重載查找期間不出現。 如果您要做的只是斷言始終滿足某些條件,請使用static_assert
。
template <typename T, std::size_t...Sizes>
class CTensor
{
static_assert(std::is_trivial<T>::value, "T required to be a trivial type");
};
不使用enable_if
怎么樣? 這不是用於(SFINAE)的含義。 看來您要做的只是一個靜態斷言:
template <typename T, std::size_t... Sizes>
class CTensor
{
static_assert(std::is_trivial<T>::value, "expecting trivial type blah blah");
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.