gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:16:49 24 4
gpt4 key购买 nike

我正在处理将按以下方式使用的模板 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。

最佳答案

For now we can assume that MyTemplate will take only list of pair types. Moreover, all pair types should have the same first type and second type have to vary.

I want to "catch" the pairs' first_type in 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 的模板参数都是具有共同 first_typestd::pairs

否则,如果没有模板特化和维护方式,您可以使用 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...>>;
};

关于c++ - 如何在可变模板的情况下应用模板模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54374289/

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