How can I check that all types in a variadic template declaration can be converted to size_t:
// instantiate only if extents params are all convertible to size_t
template<typename T, size_t N>
template<typename... E>
Array<T,N>::Array(E... extents) {
constexpr size_t n = sizeof...(extents);
static_assert(n == N, "Dimensions do not match");
// code for handling variadic template parameters corresponding to dimension sizes
}
With the following usage:
Array<double, 2> a(5,6); // OK 2-D array of 5*6 values of doubles.
Array<int, 3> a(2,10,15) // OK 3-D array of 2*10*15 values of int.
Array<int, 2> a(2, "d") // Error: "d" is not a valid dimension and cannot be implicitly converted to size_t
Here are similar questions: Check for arguments type in a variadic template declaration
With help from the really slick
all_true
trick from Columbo, it's a breeze :Live on Coliru
And in the specific case where Check is a constructor: