考虑一下:
#include <utility>
template<typename T> struct Outer {
template <bool = std::is_trivially_destructible<T>::value>
struct Details {
~Details();
};
};
template<typename T>
template<>
Outer<T>::Details<true>::~Details() {
// do some stuff
}
template<typename T>
template<>
Outer<T>::Details<false>::~Details() {
// do some other stuff
}
叮当响火
error: nested name specifier 'Outer<T>::Details<false>::' for declaration does not refer into a class, class template or class template partial specialization
。
是否可以在不将
Details
的实现完全移至 Outer
类中的情况下完成这项工作?
您可以使用
constexpr if
:
#include <utility>
template<typename T> struct Outer {
struct Details {
~Details();
};
};
template<typename T>
Outer<T>::Details::~Details() {
if constexpr(std::is_trivially_destructible<T>::value) {
// do some stuff
} else {
// do some other stuff
}
}