c++:设置一个局部专门化等于另一个
C++: Set one partial specialization equal to another
我写了一个类模板,签名如下:
template<typename ... Args> struct MyClass {};
template<typename ... A, B> struct MyClass< std::tuple<A ...>, B> {};
对于这个场景,我有两个密切相关的问题,它们都涉及到部分专门化可以相互映射的方式。如果,尽管我或多或少彻底地搜索了,这些问题已经在这里得到了解决,我也很乐意提供这些帖子的链接。
问题1:在代码中,不要写
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
关键字)?例如as (but this does not work)
template<typename B> struct MyClass<B> = MyClass<std::tuple<>, B>;
任何其他可行的替代方案都是受欢迎的,它将在没有太多开销的情况下使一个部分专业化与另一个部分专业化相等。
问题2至少在我看来是密切相关的。一般来说,我宁愿完全避免写"tuple"。因此,在与上面相同的非工作方式中,但更普遍的是,我想写一些像
这样的东西template<typename ... A, typename B> struct MyClass<B, A ... > = MyClass<std::tuple<A ...>, B>;
(我在专门化中交换了A ...
和B
的顺序,因为至少Visual Studio希望将包扩展作为最后一个参数。)
任何帮助都是感激的,提前感谢。
EDIT:它似乎不能与模板别名一起工作,见这里。
您可以使用额外的间接级别,例如:
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;
但是,如果我看对了,那么我必须将基类函数带到派生类名称空间中。
我不确定你在这里的意思,但是来自公共基类的名称已经可以在派生类作用域中访问。
是否有其他方法可以做到这一点,例如使用模板混叠(
using
关键字)?
。MyClass
是类模板,不能是别名模板
如果我对你的问题理解正确的话,我想你可能已经自己回答过了。
typedef MyClass<std:tuple<>, B> Base;
那么你可以直接写
Base myClass;
对于你的其他问题也是一样的。
相关文章:
- 是否可以对零模板参数进行模板专门化
- 使用的未初始化局部变量'Quick'
- 尝试根据类中 typedef 的存在来专门化模板函数
- 修复未初始化的局部变量错误
- 如何基于模板化类的基类专门化成员函数
- 局部变量保留函数中的值
- 为什么 'main' 函数中的局部 int 变量会自动初始化?
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- 在 OpenGL 中将笛卡尔世界坐标转换为球面局部坐标
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- c++:设置一个局部专门化等于另一个
- 用于对类进行不同的局部专门化的Varadiac宏