gpt4 book ai didi

C++:将一个部分特化设置为等于另一个

转载 作者:搜寻专家 更新时间:2023-10-31 00:34:52 24 4
gpt4 key购买 nike

我写了一个类模板,签名如下:

template<typename ... Args> struct MyClass {};
template<typename ... A, B> struct MyClass< std::tuple<A ...>, B> {};

对于这种情况,我有两个密切相关的问题,它们都涉及部分特化可以相互映射的方式。如果,尽管我进行了或多或少的彻底搜索,但这些问题已经在此处得到解决,我也很乐意提供这些主题的链接。


问题一:在代码中,而不是写

MyClass< std::tuple<>, B> myClass;

,我想创建相应的对象为

MyClass<B> myClass;

我的第一个方法是使用继承,

template<typename B>
struct Myclass<B> : public MyClass<std:tuple<>, B>
{
typedef MyClass<std:tuple<>, B> Base;

using Base::Function1;
using Base::Function2;
// ...
}

但是,如果我没看错,那么我必须将基类函数带到派生类命名空间中。此外,更多地考虑原则,这些类应该是“相同的”,而不是通过类似继承的“is-an”关系相关。

有没有其他方法可以做到这一点,例如使用模板别名(using 关键字)?例如。作为(但这不起作用)

template<typename B> struct MyClass<B> = MyClass<std::tuple<>, B>;

欢迎任何其他可行的替代方案,它应将一个部分特化设置为与另一个相同,而不会产生太多开销。


问题 2 至少在我看来是密切相关的。一般来说,我宁愿完全避免写“元组”。所以以与上面相同的非工作方式,但更一般地说,我想写一些类似的东西

template<typename ... A, typename B> struct MyClass<B, A ... > = MyClass<std::tuple<A ...>, B>;

(我在特化中交换了 A ...B 的顺序,因为至少 Visual Studio 希望将 pack-expansion 作为最后一个参数。)

感谢任何帮助,提前致谢。


编辑: 它似乎不适用于模板别名,请参阅 here .欢迎使用其他替代方案。

最佳答案

您可以使用额外的间接级别,例如:

template<typename ... Args> struct MyClass_impl {};
template<typename ... Ts, typename T> struct MyClass_impl<std::tuple<Ts ...>, T> {};

namespace detail
{
template<typename T, typename ... Ts>
struct Helper
{
using type = MyClass_impl<std::tuple<Ts...>, T>;
};

template<typename ... Args, typename ... Ts>
struct Helper<std::tuple<Args...>, Ts...>
{
using type = MyClass_impl<std::tuple<Args...>, Ts...>;
};

}

template <typename ... Ts>
using MyClass = typename detail::Helper<Ts...>::type;

关于C++:将一个部分特化设置为等于另一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25204510/

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