嵌套类型的 CRTP
CRTP with nested type
我想创建一个模板 class,它将为 class 提供通用方法,让成员 m_Type
指定继承 [=19] 提供的某种类型=].考虑一下:
template<typename T>
struct TypeAttribute
{
T m_Type;
};
template<typename T>
struct TypeAttribute2
{
using Type = typename T::Type;
Type m_Type;
};
struct Foo : TypeAttribute<Foo::Type>
{
enum class Type
{
Type1
};
};
struct Bar : TypeAttribute2<Bar>
{
enum class Type
{
Type1
};
};
由于类型不完整(第一种情况 Foo::Type
和第二种情况 Bar::Type
),这两种情况都失败了,这是可以理解的。我是否遗漏了一些微不足道的东西,或者这只是一种错误的方法,我应该将嵌套类型移到 classes 之外(我只是希望 classes 将相关类型包含在它们自身内部,而不是填充更高的命名空间). Live demo here.
当你声明struct Foo
并从TypeAttribute
继承时,Foo
还不是一个完整的类型。 struct Bar
.
相同
你的问题非常接近这个 post.
也许我做的这段代码可以帮到你Live Demo
#include <iostream>
#include <string>
#include <memory>
enum class ChildType
{
Child1,
Child2
};
template <typename Derived>
struct Parent
{
void DisplayChildType() const
{
switch (Derived::type_)
{
case ChildType::Child1: std::cout << "Child1" << std::endl; break;
case ChildType::Child2: std::cout << "Child2" << std::endl; break;
default:;
}
}
};
struct Child1 : Parent<Child1>
{
static constexpr ChildType type_ = ChildType::Child1;
};
struct Child2 : Parent<Child2>
{
static constexpr ChildType type_ = ChildType::Child2;
};
template <typename Type>
void DisplayType(const Type& child)
{
const Parent<Type>* asParent = &child;
asParent->DisplayChildType();
}
int main()
{
Child1 child1;
Child2 child2;
DisplayType(child1);
DisplayType(child2);
}
我想创建一个模板 class,它将为 class 提供通用方法,让成员 m_Type
指定继承 [=19] 提供的某种类型=].考虑一下:
template<typename T>
struct TypeAttribute
{
T m_Type;
};
template<typename T>
struct TypeAttribute2
{
using Type = typename T::Type;
Type m_Type;
};
struct Foo : TypeAttribute<Foo::Type>
{
enum class Type
{
Type1
};
};
struct Bar : TypeAttribute2<Bar>
{
enum class Type
{
Type1
};
};
由于类型不完整(第一种情况 Foo::Type
和第二种情况 Bar::Type
),这两种情况都失败了,这是可以理解的。我是否遗漏了一些微不足道的东西,或者这只是一种错误的方法,我应该将嵌套类型移到 classes 之外(我只是希望 classes 将相关类型包含在它们自身内部,而不是填充更高的命名空间). Live demo here.
当你声明struct Foo
并从TypeAttribute
继承时,Foo
还不是一个完整的类型。 struct Bar
.
相同
你的问题非常接近这个 post.
也许我做的这段代码可以帮到你Live Demo
#include <iostream>
#include <string>
#include <memory>
enum class ChildType
{
Child1,
Child2
};
template <typename Derived>
struct Parent
{
void DisplayChildType() const
{
switch (Derived::type_)
{
case ChildType::Child1: std::cout << "Child1" << std::endl; break;
case ChildType::Child2: std::cout << "Child2" << std::endl; break;
default:;
}
}
};
struct Child1 : Parent<Child1>
{
static constexpr ChildType type_ = ChildType::Child1;
};
struct Child2 : Parent<Child2>
{
static constexpr ChildType type_ = ChildType::Child2;
};
template <typename Type>
void DisplayType(const Type& child)
{
const Parent<Type>* asParent = &child;
asParent->DisplayChildType();
}
int main()
{
Child1 child1;
Child2 child2;
DisplayType(child1);
DisplayType(child2);
}