在可变参数模板的情况下如何应用模板模板参数

时间:2019-01-25 23:49:42

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

我正在研究模板MyTemplate,该模板将通过以下方式使用:

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

现在,我们可以假设MyTemplate仅接受成对类型的列表。此外,所有配对类型应具有相同的第一类型,第二类型必须有所不同。

我想在first_type中“捕获”两对的MyTemplate。我想出了以下定义:

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。

1 个答案:

答案 0 :(得分:3)

  

现在,我们可以假设MyTemplate仅接受成对类型的列表。此外,所有配对类型应具有相同的第一类型,第二类型必须有所不同。

     

我想在first_type中“捕获”两对的MyTemplate

不确定,但在我看来,您的外观如下

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::pairs的所有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...>>;
 };