Ваша проблема - типичная проблема, для которой в C ++ 17 было введено if constexpr
if constexpr (std::is_same<Allocator, customAllocator<T>>::value) {
std::cout << "****" << std::endl;
std::cout << alloc.member_ << std::endl;
std::cout << alloc_.member_ << std::endl;
std::cout << "****" << std::endl;
}
До C ++ 17 if constexpr
недоступен, поэтому std::cout << alloc.member_
компилируется также, когда тест std::is_same
имеет значение false.
Таким образом, вы должны каким-то образом разработать две разные функции: одну для customAllocator
и одну для других.
Полагаю, вы можете попробовать что-то вроде следующего (осторожно: код не проверен)
template <typename T>
void printMember (customAllocator<T> const & a)
{
std::cout << "****" << std::endl;
std::cout << alloc.member_ << std::endl;
std::cout << alloc_.member_ << std::endl;
std::cout << "****" << std::endl;
}
template <typename A>
void printMember (A const &)
{ }
explicit list(const Allocator& alloc = Allocator())
: alloc_(alloc), head_(nullptr), tail_(nullptr), size_(0)
{ printMember(alloc); }
При желании вы также можете написать функцию для распределителей с member_
членом и одну для других.
Что-то следующее (осторожно: код не проверен)
template <typename A>
auto printMember (A const & a, int)
-> decltype( a.member_, void() )
{
std::cout << "****" << std::endl;
std::cout << alloc.member_ << std::endl;
std::cout << alloc_.member_ << std::endl;
std::cout << "****" << std::endl;
}
template <typename A>
void printMember (A const &, long)
{ }
explicit list(const Allocator& alloc = Allocator())
: alloc_(alloc), head_(nullptr), tail_(nullptr), size_(0)
{ printMember(alloc, 0); }