【问题标题】:How to apply template template parameters in case of variadic template在可变参数模板的情况下如何应用模板模板参数
【发布时间】:2019-01-25 23:49:41
【问题描述】:

我正在开发模板MyTemplate,它将以下列方式使用:

using Alias = MyTemplate<std::pair<int, char>,
                         std::pair<int, double>,
                         std::pair<int, unsigned int>>;

现在我们可以假设MyTemplate 将只获取对类型的列表。此外,所有对类型都应具有相同的第一种类型,而第二种类型必须有所不同。

我想在MyTemplate 中“捕捉”这对first_type。我想出了以下定义:

template<typename... Ts>
struct MyTemplate
{
   using first_type = std::decay_t<decltype((Ts::first_type, ...))>;
   // ...
};

当我在不同模板的上下文中使用typename MyTemplate::first_type 时,一切正常。我只收到一个警告:

warning: left operand of comma operator has no effect [-Wunused-value]
    using first_type = std::decay_t<decltype((Ts::first_type, ...))>;
                                                                    ^

但是,我无法创建 Alias 的实例,因为我收到了该错误:

error: missing 'typename' prior to dependent type name 'std::pair<int, char>::first_type'

您对“通用”解决方案有任何想法吗?我可以使用 C+17。

【问题讨论】:

  • std::decay_t&lt;decltype((Ts::first_type, ...))&gt; 没有意义。您使用 , 折叠表达式,但使用类型作为操作数?
  • 不清楚你真正想要的行为是什么。 first_type 应该是什么?你有很多对 - 你试图实现的实际功能是什么
  • 问题出在“创建实例”部分,而不是上面显示的模板的定义(尽管这也有其自身的问题)。而且由于“创建实例”部分没有显示,所以这个问题无法回答,但很可能是a duplicate of this one,或者of this one。
  • 另外,您是否有不想使用MyTemplate&lt;int, char, double, unsigned int&gt; 而不是MyTemplate&lt;std::pair&lt;int, char&gt;, std::pair&lt;int, double&gt;, std::pair&lt;int, unsigned int&gt;&gt; 的原因?您将能够轻松地在模板中生成pair 类型的列表,并且您不需要提取第一个类型。

标签: c++ templates c++17 variadic-templates template-argument-deduction


【解决方案1】:

现在我们可以假设MyTemplate 将只获取对类型的列表。此外,所有对类型都应具有相同的第一种类型,而第二种类型必须有所不同。

我想在MyTemplate 中“捕捉”这对first_type。

不确定,但在我看来,您看起来如下

template <typename...>
struct MyTemplate;

template <typename FT, typename ... STs>
struct MyTemplate<std::pair<FT, STs>...>
 {
   using first_type = FT;
 };

你可以验证

using Alias = MyTemplate<std::pair<int, char>,
                         std::pair<int, double>,
                         std::pair<int, unsigned int>>;

static_assert( std::is_same<int, typename Alias::first_type>::value, "!" );

这样你也可以强制MyTemplate的模板参数都是std::pairss和一个共同的first_type。

否则,如果没有模板专业化和维护方式,您可以使用std::tuple/std::tuple_element_t

template <typename ... Ts>
struct MyTemplate
 {
   using first_type = std::tuple_element_t<0, std::tuple<typename Ts::first_type...>>;
 };

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 2014-09-08
    • 2014-04-12
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2016-10-06
    相关资源
    最近更新 更多