C++ 概念:CRTP
C++ Concepts : CRTP
可能只是概念不好,但我看不出为什么。并且没有找到任何带有构造函数的示例。或者它可能与构造函数无关...
template < typename T >
concept bool C_Object() {
return requires {
T();
};
}
template < C_Object Object>
class DefaultManager {
// Content;
};
template < C_Object Derived >
class Component {
// Content
};
struct Test : public Component<Test> {
int data;
Test() = default;
};
int main() {
Test test;
return 0;
}
报错:
test2.cpp:21:36: error: template constraint failure
struct Test : public Component<Test> {
^
test2.cpp:21:36: note: constraints not satisfied
test2.cpp:2:14: note: within ‘template<class T> concept bool C_Object() [with T = Test]’
concept bool C_Object() {
^~~~~~~~
test2.cpp:2:14: note: the required expression ‘T()’ would be ill-formed
听起来像:"Hey my code is broken, please fix it",抱歉。
总之谢谢
祝你有美好的一天
问题在这里:
struct Test : public Component<Test> {
只要您 命名 受约束的 class 模板的特化,就会根据约束验证给定的参数。在这种特殊情况下,这意味着检查 C_Object<Test>
是否满足,但由于 Test
不完整 - 编译器尚未解析其定义 - C_Object
不满足。
这是 classCRTP 基础问题的 "concepts" 版本:您必须延迟派生 class 的检查,直到其定义完成。
我发现最易读的选项是具有约束 return 类型的“impl”方法。让我们把中的例子移植到C++20:
template <typename Var>
concept Fooable = requires(Var var) {
{var.foo()};
};
template <typename Derived>
struct mixin {
void bar() { impl().foo(); }
Fooable auto& impl() { return static_cast<Derived&>(*this); } // Constrain return here!
};
// no constraint violation
struct ex1 : mixin<ex1> {
void foo() {}
};
// no violation either
struct ex2 : mixin<ex2> {};
int main() {
// mixin<ex1>::bar constraints respected
ex1{}.bar();
// mixin<ex2>::bar constraints violation
ex2{}.bar();
}
可能只是概念不好,但我看不出为什么。并且没有找到任何带有构造函数的示例。或者它可能与构造函数无关...
template < typename T >
concept bool C_Object() {
return requires {
T();
};
}
template < C_Object Object>
class DefaultManager {
// Content;
};
template < C_Object Derived >
class Component {
// Content
};
struct Test : public Component<Test> {
int data;
Test() = default;
};
int main() {
Test test;
return 0;
}
报错:
test2.cpp:21:36: error: template constraint failure
struct Test : public Component<Test> {
^
test2.cpp:21:36: note: constraints not satisfied
test2.cpp:2:14: note: within ‘template<class T> concept bool C_Object() [with T = Test]’
concept bool C_Object() {
^~~~~~~~
test2.cpp:2:14: note: the required expression ‘T()’ would be ill-formed
听起来像:"Hey my code is broken, please fix it",抱歉。
总之谢谢
祝你有美好的一天
问题在这里:
struct Test : public Component<Test> {
只要您 命名 受约束的 class 模板的特化,就会根据约束验证给定的参数。在这种特殊情况下,这意味着检查 C_Object<Test>
是否满足,但由于 Test
不完整 - 编译器尚未解析其定义 - C_Object
不满足。
这是 classCRTP 基础问题的 "concepts" 版本:您必须延迟派生 class 的检查,直到其定义完成。
我发现最易读的选项是具有约束 return 类型的“impl”方法。让我们把
template <typename Var>
concept Fooable = requires(Var var) {
{var.foo()};
};
template <typename Derived>
struct mixin {
void bar() { impl().foo(); }
Fooable auto& impl() { return static_cast<Derived&>(*this); } // Constrain return here!
};
// no constraint violation
struct ex1 : mixin<ex1> {
void foo() {}
};
// no violation either
struct ex2 : mixin<ex2> {};
int main() {
// mixin<ex1>::bar constraints respected
ex1{}.bar();
// mixin<ex2>::bar constraints violation
ex2{}.bar();
}