gpt4 book ai didi

c++ - 用于 future 派生类型的基本模板类型的模板特化

转载 作者:行者123 更新时间:2023-12-05 01:50:01 25 4
gpt4 key购买 nike

我有一个类作为一些基元或自定义类型的包装器。我想为自定义模板类型编写显式特化。我重现问题的代码:


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 模式(直接或通过 BaseCrtpT 之间的某个基类)。同样,如果 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com