微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从模板模板参数中提取第一个模板参数并在类中使用它?

如何解决从模板模板参数中提取第一个模板参数并在类中使用它?

我有以下问题:一个类模板 A 有几个模板参数,我想构建一个类 B,将 A 作为模板参数并提取 A 的第一个模板参数以便在某些方法中使用它(想想从 std::vector提取 int 并返回认 int{}).

#include <iostream>

template<typename... Ts>
struct A {};

template<template <typename InnerType> typename U> // <--- I'd like to use InnerType!
struct B {
  InnerType foo() { return InnerType{}; }
};

int main()
{
  B<A<int>> b;
  std::cout << b.foo() << "\n"; 

  return 0;
}

我知道这种幼稚的方式不会编译,但我不知道如何实现这样的目标。任何提示表示赞赏。

解决方法

您不能直接命名模板模板参数的模板参数。尽管看起来您可以命名它,但您注意到该名称实际上无法使用。

但是,您可以对采用单个模板参数的类型使用显式特化。

template<typename... Ts>
struct B;  // incomplete type,only needed for specialization

template<template <typename> typename U,typename InnerType>
struct B<U<InnerType>>  // specialized to be able to use InnerType
{  
  InnerType foo() { return InnerType{}; }
};

这是一个 demo

当然,您也可以通过为这些情况添加特化来对具有多个参数的模板执行类似的操作。

,

没有InnerType。这是一个助记符。模板第一个参数的预期用途的文档。它是完全可选的。 B 的声明等价于

template<template <typename> typename U> // No name
struct B {
  InnerType foo() { return InnerType{}; } // What now?
};

类模板不是类型。他们是生产类型的工厂。您无法查询工厂以获取它将使用的参数,因为它还不知道。此外,您定义 B 以接受模板作为参数,而实际上您打算为其提供类型。这就是参数/参数不匹配。

但是可以查询工厂的结果。如果您将 B 的定义更改为接受类型而不是模板,那么您可以将其专门用于从模板创建的类型。这将使工厂和它使用的参数都可以推论。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。