constexpr, ++ 11 ( ).
, class A names ( names), static constexpr ( ), class ( ) ( cpp, ) .
, , ++ 17, .
#include <iostream>
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&) [N]) noexcept {
return N;
}
template <typename T>
class A {
public:
static constexpr char const * names[] = {"foo", "bar"};
};
template <>
class A<bool> {
public:
static constexpr char const * names[] = {"foo", "bar", "foobar"};
};
template<typename T>
constexpr char const * A<T>::names[];
constexpr char const * A<bool>::names[];
int main()
{
std::cout << arraySize(A<long>::names) << std::endl;
std::cout << arraySize(A<bool>::names) << std::endl;
}
--- EDIT ---
OP
. , " " , .
, names base (namesB, base-for-names), names.
namesB class A.
#include <iostream>
template <typename T, std::size_t N>
constexpr std::size_t arraySize(T (&) [N]) noexcept
{ return N; }
template <typename T>
struct namesB
{ static constexpr char const * names[] = {"foo", "bar"}; };
template <>
struct namesB<bool>
{ static constexpr char const * names[] = {"foo", "bar", "foobar"}; };
template <typename T>
class A : public namesB<T>
{ };
template<typename T>
constexpr char const * namesB<T>::names[];
constexpr char const * namesB<bool>::names[];
int main()
{
std::cout << arraySize(A<long>::names) << std::endl;
std::cout << arraySize(A<bool>::names) << std::endl;
}