部分定义/别名模板模板参数
Partially defining / aliasing a template template parameter
我正在尝试使用 CRTP 和模板模板参数,以及模板派生 class,并在传递给基础 class 以完全定义之前指定一些但不是全部参数.我可以比较的最接近的概念类似于模板化别名,但由于它必须全部位于 class 定义的单个顶行中,我不确定如何实现它。希望一个例子能让它更清楚一点...
到目前为止,这是我的代码:
template<template<typename> class Template1, typename Param1>
class Base
{
public:
using type = Param1;
};
template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<template<typename P1> class Template1<P1, Param2>, Param1>
{};
template<typename Param1, typename Param2>
class Template1
{};
int main()
{
Derived<Template1, int, double>::type d = 0;
}
当前失败,原因如下:
9:89:错误:模板参数的数量错误(1,应该是 2)
2:7:错误:为 'template<template class Template1, class Param1> class Base' 提供
在函数 'int main()' 中:
18:3: 错误: 'type' 不是 'Derived<Template1, int, double>'
的成员
那个错误消息真正让我困惑的是,我在任何地方都看不到我只指定了一个模板参数。我还发现,如果我按如下方式定义 Derived,那么它编译得很好:
template<typename> class Test {};
template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<Test, Param1>
{};
我认为这表明问题肯定出在这条线上(不出所料,这是我不清楚如何实现的一点):
class Derived : public Base<template<typename P1> typename Template1<P1, Param2>, Param1>
基本上,我在这里尝试定义一个具有单个参数的新模板,它是具有两个参数的第一个模板的部分特化。我想我做的不对。但是我怎么能在一条线上呢?
在此先感谢您的帮助。如果有任何不清楚的地方,我们深表歉意!
可能是这样的:
template<template<typename, typename> class TwoParamTemplate, typename Param2>
struct BindSecond {
template <typename Param1>
using type = TwoParamTemplate<Param1, Param2>;
};
template<template<typename, typename> class Template1,
typename Param1, typename Param2>
class Derived : public Base<BindSecond<Template1, Param2>::template type, Param1>
{};
我正在尝试使用 CRTP 和模板模板参数,以及模板派生 class,并在传递给基础 class 以完全定义之前指定一些但不是全部参数.我可以比较的最接近的概念类似于模板化别名,但由于它必须全部位于 class 定义的单个顶行中,我不确定如何实现它。希望一个例子能让它更清楚一点...
到目前为止,这是我的代码:
template<template<typename> class Template1, typename Param1>
class Base
{
public:
using type = Param1;
};
template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<template<typename P1> class Template1<P1, Param2>, Param1>
{};
template<typename Param1, typename Param2>
class Template1
{};
int main()
{
Derived<Template1, int, double>::type d = 0;
}
当前失败,原因如下:
9:89:错误:模板参数的数量错误(1,应该是 2) 2:7:错误:为 'template<template class Template1, class Param1> class Base' 提供 在函数 'int main()' 中: 18:3: 错误: 'type' 不是 'Derived<Template1, int, double>'
的成员那个错误消息真正让我困惑的是,我在任何地方都看不到我只指定了一个模板参数。我还发现,如果我按如下方式定义 Derived,那么它编译得很好:
template<typename> class Test {};
template<template<typename, typename> class Template1, typename Param1, typename Param2>
class Derived : public Base<Test, Param1>
{};
我认为这表明问题肯定出在这条线上(不出所料,这是我不清楚如何实现的一点):
class Derived : public Base<template<typename P1> typename Template1<P1, Param2>, Param1>
基本上,我在这里尝试定义一个具有单个参数的新模板,它是具有两个参数的第一个模板的部分特化。我想我做的不对。但是我怎么能在一条线上呢?
在此先感谢您的帮助。如果有任何不清楚的地方,我们深表歉意!
可能是这样的:
template<template<typename, typename> class TwoParamTemplate, typename Param2>
struct BindSecond {
template <typename Param1>
using type = TwoParamTemplate<Param1, Param2>;
};
template<template<typename, typename> class Template1,
typename Param1, typename Param2>
class Derived : public Base<BindSecond<Template1, Param2>::template type, Param1>
{};