gpt4 book ai didi

c++ - 在模板中推断子类模板类型

转载 作者:太空狗 更新时间:2023-10-29 20:00:33 25 4
gpt4 key购买 nike

我有一个派生自模板类的类:

template <typename A,typename B>
class TemplatedClass {

};

class Hello : public TemplatedClass<int,float>
{

};

现在,我想制作一个模板化类,它将从 Hello 中推断出类型 int,float .
我以为我可以做这样的事情,但它不起作用:

template <template <typename A,typename B> class C>
class Check
{
void Foo(A,B,C)
{
// A is int .. B is float .. C is Hello
}
};



int _tmain(int argc, _TCHAR* argv[])
{
Check<Hello> a;
}

我该怎么做?

编辑:

我想传递类 Hello 并让模板推断其子类 TemplatedClass 使用的类型。

所以,当我创建一个类时 Check<Hello>它将获得类型 int 和 float

我真的无法更改 TemplatedClass 以包含 typedef(它来自外部 .lib)

编辑:

我已将模板更改为使用 Class ,但我收到此错误:
错误 C3200:“你好”:模板参数“C”的无效模板参数,需要一个类模板

最佳答案

首先,将 typename 更改为 class§14.1 [temp.param] p1:

type-parameter:

  • class identifieropt
  • class identifieropt = type-id
  • typename identifieropt
  • typename identifieropt = type-id
  • template <template-parameter-list > class identifieropt
  • template <template-parameter-list > class identifieropt = id-expression

接下来,进行偏特化:

template<class T>
class Check;

template< // not 'typename' vvvvv
template<typename,typename> class C,
typename A, typename B
>
struct Check<C<A,B> >{
// ...
};

尽管如此,您仍然不能只将 Hello 传递给模板,因为即使 Hello 派生自 TemplatedClass,类型转换也不是允许用于模板参数:

Check<Hello> c; // nope, 'Hello' is not a template

您可以将以下 typedef 添加到 Hello 类中:

class Hello
: TemplatedClass<int,float>
{
public:
typedef TemplatedClass<int,float> base_type;
};

然后做:

检查c;//好的但是 Check 中的 C 参数将是 template TemplatedClass,而不是 Hello。可悲的是,没有办法直接实现这一目标。一种解决方案是将派生类型作为额外的模板参数传递,或者仅将派生类型作为唯一参数传递并在内部进行类型提取:

template<class T>
class CheckInternal;

template<
template<typename,typename> class C,
typename A, typename B
>
class CheckInternal<C<A,B> >{
public:
typedef A type_A;
typedef B type_B;
};

template<class T>
class Check{
typedef typename T::base_type T_base_type;
typedef typename CheckInternal<T_base_type>::type_A type_A;
typedef typename CheckInternal<T_base_type>::type_B type_B;

void foo(type_A a, type_B b){
// ...
}
};

// usage:
C<Hello> c; // OK!

关于c++ - 在模板中推断子类模板类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6323255/

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