从结构中提取模板类型

问题描述 投票:0回答:2

我有简单的标签结构

template<typename...>
struct tag{};

还有一个班级

template <typename T, typename ...Args>
class Impl {
  public:
    T func(Args...);
};

是否可以进行转换/专业化或其他操作,以允许编写

Impl<int, tag<int, double>>
并将其转换为
Impl<int, int, double>
辅助结构也可以工作。

我尝试过使用模板模板参数,但这似乎是相反的,即将类型放入模板中。我还尝试在

tag
中使用类型别名:

template<typename... Args>
struct tag {
    using types = Args;
};

但是这是不允许的。

c++ templates
2个回答
1
投票
#include <type_traits>

template <template<typename, typename...> class T, typename R, typename A>
struct Apply;

template <template<typename, typename...> class T,  typename R, typename... Args>
struct Apply<T, R, tag<Args...>>: std::type_identity<T<R, Args...>> {};

template<typename...>
struct tag{};

template <typename T, typename ...Args>
class Impl {
  public:
    T func(Args...);
};

int main() {
    Apply<Impl, int, tag<int, float>>::type impl;
    impl.func(0, 1.0);
}

这里

Apply<Impl, int, tag<int, float>>::type
表示类型
Impl<int, int, float>


0
投票

这些声明声明了不同的类型,但如果您不需要它们是同一类型,您可以添加一个继承自

Impl<T, Args...>
的专业化:

template <class T, class... Args>
class Impl<T, tag<Args...>> : public Impl<T, Args...> {
    using Impl<T, Args...>::Impl;
    using Impl<T, Args...>::operator=;
};

Impl<T, tag<Args...>>
现在将具有
Impl<T, Args...>
的成员函数。 演示

© www.soinside.com 2019 - 2024. All rights reserved.