我正在研究模板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。
答案 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...>>;
};