如何从双参数模板创建单参数模板以用作基类模板模板参数

时间:2016-10-12 16:02:39

标签: c++ templates

以下是我想要做的一个例子。我只是用它来说明问题。

#include <iostream>
using namespace std;

template <int STEP, bool SIDE> class Stepper {
    int step( int x ) {
        return SIDE ? x + STEP : x - STEP;
    }
};

template <template <bool> typename STEPPER> class DualStepper {
    STEPPER<true> upStepper;
    STEPPER<false> downStepper;

    pair<int , int> step( int x ) {
        return pair<int , int>( upStepper.step( x ), downStepper.step( x ) );
    }
};


template <int STEP> class FixedDualStepper : public DualStepper<template <bool SIDE> using FT = Stepper<STEP, SIDE>> {

};


int main() {

    FixedDualStepper<5> stepper;
    pair<int, int> x = stepper.step( 10 );
    cout << x.first << '\t' << x.second << endl;

    return 0;
}

为此我收到错误:

/Work/Learn/04PartialTemplate/main.cpp:23:115: error: template argument 1 is invalid
template <int STEP> class FixedDualStepper : public DualStepper<template <bool SIDE> using FT = Stepper<STEP, SIDE>> {
                                                                                                               ^
/Work/Learn/04PartialTemplate/main.cpp: In function ‘int main()’:
/Work/Learn/04PartialTemplate/main.cpp:31:29: error: ‘class FixedDualStepper<5>’ has no member named ‘step’
   pair<int, int> x = stepper.step( 10 );

是否有我可以在

中使用的语法
... : public DualStepper< ??? >

获得理想的效果。即将Stepper的第一个参数设置为STEP并获取单个参数类模板,以用作DualStepper的模板模板参数?

1 个答案:

答案 0 :(得分:1)

你可以使用结构和使用声明来做到这一点 它遵循一个最小的工作示例:

template <int STEP, bool SIDE>
class Stepper {};

template<int S>
struct Type {
    template<bool b>
    using TStepper = Stepper<S, b>;
};

template<template<bool> class C>
void f() {}

int main() {
    f<Type<0>::TStepper>();
}

在你的情况下,它将是:

template <template <bool> class STEPPER>
class DualStepper {
    // ....
};


template <int STEP>
class FixedDualStepper
    : public DualStepper<Type<STEP>::template TStepper> {
    // ...
};