- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个类作为一些基元或自定义类型的包装器。我想为自定义模板类型编写显式特化。我重现问题的代码:
template < class T >
struct A {
void func() { std::cout << "base\n"; }
};
template <>
struct A<int> {};
template < class T, class CRTP >
struct BaseCrtp {
void someFunc() {
CRTP::someStaticFunc();
}
};
struct DerrType : BaseCrtp<int, DerrType> {
static void someStaticFunc() {}
};
template < class T, class CRTP >
struct A< BaseCrtp<T, CRTP> > {
void func() { std::cout << "sometype\n"; }
};
int main() {
A<DerrType> a;
a.func(); // print: "base". should be: "sometype"
return 0;
}
A<DerrType>
使用默认功能,而不是特化。我怎样才能对这些类(class)集进行特化?我会有很多类型,比如 DerrType
,我想为他们所有人做出共同的行为。 DerrType
和其他将用作奇怪的重复模板模式
最佳答案
不确定我是否完全理解您想要什么,但也许是这样的:
template<typename T>
concept DerivedFromBaseCrtp = requires(T& t) {
[]<typename U, typename CRTP>(BaseCrtp<U, CRTP>&){}(t);
};
template < DerivedFromBaseCrtp T >
struct A<T> {
void func() { std::cout << "sometype\n"; }
};
这个概念基本上检查是否T
等于或公开继承(直接或间接)自 BaseCrtp
的某些特化.否则对 lambda 的调用将是错误的。仅当参数和参数类型完全匹配或参数具有参数的派生类型时,模板参数推导才会在调用中成功。如果该类是非公开继承的,则调用中的引用不能绑定(bind)到参数。
但是,如果类型是从多个 继承的,这个概念将失败BaseCrtp
特化,在这种情况下,调用中的模板参数推导将无法在多个选项之间进行选择。
或者你也可以使用更严格的概念
template<typename T>
concept CrtpDerivedFromBaseCrtp = requires(T& t) {
[]<typename U>(BaseCrtp<U, T>&){}(t);
};
这还需要类型 T
实际上是在 BaseCrtp
上使用 CRTP 模式(直接或通过 BaseCrtp
和 T
之间的某个基类)。同样,如果 T
,这将失败从某些 BaseCrtp<U, T>
中多次继承特化,尽管它会忽略类型不是 T
的特化在第二个位置。
对于另一种选择,您可能需要检查 T
派生自某种类型 X
这样 X
源自 BaseCrtp<U, X>
对于一些 U
(这意味着 X
正确使用了 CRTP 模式)。这可以使用这种变体来完成:
template <typename T>
concept CrtpDerivedFromBaseCrtp =
requires(T& t) {
[]<typename U, typename CRTP>(BaseCrtp<U, CRTP>&)
requires(std::is_base_of_v<CRTP, T> &&
std::is_base_of_v<BaseCrtp<U, CRTP>, CRTP>)
{}
(t);
};
同样,如果 T
则失败源自多个 BaseCrtp
直接或间接的特化。
关于c++ - 用于 future 派生类型的基本模板类型的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73485556/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!