我有简单的标签结构
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;
};
但是这是不允许的。
#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>
。
这些声明声明了不同的类型,但如果您不需要它们是同一类型,您可以添加一个继承自
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...>
的成员函数。
演示