gpt4 book ai didi

c++ - 特化模板 class U>

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:00:00 27 4
gpt4 key购买 nike

我对嵌套模板及其模板特化有疑问。给定以下类:

一个小模板类

template<class U>
class T {
public:
T(){}
virtual ~T (){}

};

还有一些嵌套模板

template<typename T, template<typename> class U>
class A {
public:
void foo()
{
std::cerr << "A generic foo";
}
};

还有一个小的 main.cpp

int main(int argc, const char *argv[])
{
A<int,T> *a = new A<int,T>;
a->foo();

//This wont work:
A<double,T*> *b = new A<double,T*>;
b->foo();

return 0;
}

如果 U 是指针,现在我需要一个特化:

    A<double,T*> *b = new A<double,T*>;
b->foo();

如何实现?我试过类似的东西:

template<typename T, template<typename> class U>
class A< T, U* >
{
public:
void foo()
{
std::cerr << "A specialized foo";
}
};

但它只是解决了

A.h:18:16: Error: Templateargument 2 is invalid

最佳答案

你想做的事是不可能的,因为T*没有任何意义。它既不是正确的类型,也不匹配需要额外参数的模板。如果U代表 T* , 什么会 U<int>是?你可能是说 T<int>*但这与您的声明不符,因此无法将该类型插入 A .

既然你问了一个解决这个问题的方法,我就想到了这样的事情。

接受 A 的第三个模板参数,我称之为 Expander并将其默认设置为:

template <typename T> struct Expander {
typedef T type;
};

然后,当调用 A 时你可以说

A<int,T> normal;
A<int,T,PtrExpander> pointer;

template <typename T> struct PtrExpander {
typedef T* type;
};

A会是:

template<typename T, template<typename> class U, template <typename> class E = Expander> class A {
typedef typename E<U<Your_Args_to_U> >::type;

关于c++ - 特化模板<typename T, template<typename> class U>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047780/

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