#include <iostream>
#include <type_traits>
// Traits class
template <typename T, typename = void>
struct VectorTraits;
template <typename T>
struct VectorTraits<T, std::enable_if_t<(T::dimension > 0)>>
{
typedef T VectorType;
typedef typename T::ValueType ValueType;
static const std::uint16_t dimension = T::dimension;
};
// Fake vector class. Defines the required typedef.
struct Vec
{
typedef float ValueType;
static const std::uint16_t dimension = 2;
};
// Fake vector class. Defines the required typedef.
struct VecFake
{
};
template <>
struct VectorTraits<VecFake>
{
typedef VecFake VectorType;
typedef float ValueType;
static const std::uint16_t dimension = 12;
};
// Streaming operator attempt for classes defining VectorTraits.
template <class T, typename = std::enable_if_t<(sizeof(VectorTraits<T>) > 0)>>
std::ostream& operator << (std::ostream& stream, const T& )
{
return stream << "Traits. Dimension = " << VectorTraits<T>::dimension << "\n";
}
int main()
{
std::cout << "Test\n";
std::cout << Vec();
std::cout << VecFake();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogICAgI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKICAgIC8vIFRyYWl0cyBjbGFzcwogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lID0gdm9pZD4KICAgIHN0cnVjdCBWZWN0b3JUcmFpdHM7CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgc3RydWN0IFZlY3RvclRyYWl0czxULCBzdGQ6OmVuYWJsZV9pZl90PChUOjpkaW1lbnNpb24gPiAwKT4+CiAgICB7CiAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZTsKICAgICAgdHlwZWRlZiB0eXBlbmFtZSBUOjpWYWx1ZVR5cGUgICBWYWx1ZVR5cGU7CiAgICAgIHN0YXRpYyBjb25zdCBzdGQ6OnVpbnQxNl90ICAgICAgZGltZW5zaW9uID0gVDo6ZGltZW5zaW9uOwogICAgfTsKICAgIAogICAgCiAgICAvLyBGYWtlIHZlY3RvciBjbGFzcy4gRGVmaW5lcyB0aGUgcmVxdWlyZWQgdHlwZWRlZi4KICAgIHN0cnVjdCBWZWMKICAgIHsKICAgICAgdHlwZWRlZiBmbG9hdCAgIFZhbHVlVHlwZTsKICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dWludDE2X3QgZGltZW5zaW9uID0gMjsKICAgIH07CiAgICAKICAgIC8vIEZha2UgdmVjdG9yIGNsYXNzLiBEZWZpbmVzIHRoZSByZXF1aXJlZCB0eXBlZGVmLgogICAgc3RydWN0IFZlY0Zha2UKICAgIHsKICAgIH07CiAgICAKICAgIHRlbXBsYXRlIDw+CiAgICBzdHJ1Y3QgVmVjdG9yVHJhaXRzPFZlY0Zha2U+CiAgICB7CiAgICAgIHR5cGVkZWYgVmVjRmFrZSAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZTsKICAgICAgdHlwZWRlZiBmbG9hdCAgIFZhbHVlVHlwZTsKICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6dWludDE2X3QgICAgICBkaW1lbnNpb24gPSAxMjsKICAgIH07CiAgICAKICAgIC8vIFN0cmVhbWluZyBvcGVyYXRvciBhdHRlbXB0IGZvciBjbGFzc2VzIGRlZmluaW5nIFZlY3RvclRyYWl0cy4KICAgIHRlbXBsYXRlIDxjbGFzcyBULCB0eXBlbmFtZSA9IHN0ZDo6ZW5hYmxlX2lmX3Q8KHNpemVvZihWZWN0b3JUcmFpdHM8VD4pID4gMCk+PgogICAgc3RkOjpvc3RyZWFtJiBvcGVyYXRvciA8PCAoc3RkOjpvc3RyZWFtJiBzdHJlYW0sIGNvbnN0IFQmICkKICAgIHsKICAgICAgICByZXR1cm4gc3RyZWFtIDw8ICJUcmFpdHMuIERpbWVuc2lvbiA9ICIgPDwgVmVjdG9yVHJhaXRzPFQ+OjpkaW1lbnNpb24gPDwgIlxuIjsKICAgIH0KICAgIAogICAgaW50IG1haW4oKQogICAgewogICAgICAgIHN0ZDo6Y291dCA8PCAiVGVzdFxuIjsKICAgICAgICBzdGQ6OmNvdXQgPDwgVmVjKCk7CiAgICAgICAgc3RkOjpjb3V0IDw8IFZlY0Zha2UoKTsKICAgIH0=