如何强制使用匿名模板参数从super派生模板参数类

时间:2016-01-08 05:53:15

标签: c++ templates inheritance template-specialization

我有几个模板类

template < class Cost >
class Transition {
  public:
    virtual Cost getCost() = 0;
};

template < class TransitionCl, class Cost >
class State {
    protected:
        State(){
            static_assert(
                std::is_base_of< Transition< Cost >, TransitionCl >::value,
                "TransitionCl class in State must be derived from Transition< Cost >"
            );
        }
    public:
        virtual void apply( const TransitionCl& ) = 0;
};

我宁愿不必将Cost传递给State,因为State完全独立于Cost,但我想确保TransitionCl实现Transition接口。

有没有办法在第二个模板中设置Cost匿名,以便在声明新的State类时不必传递它?

供参考,我正在使用g++ -std=c++14 [source file]

编辑:我发布了一个改写(并且希望更清晰)的问题版本并得到了最佳答案here

2 个答案:

答案 0 :(得分:4)

根据我对你的问题的理解,这是我的快速解决方案:

statusData = { message: "Some error occured", Status: false };

在上面的示例中,您无需通过“成本”和“成本”。在创建State对象时输入。

=====更新======

template < class Cost >
class Transition {
  public:
    virtual Cost getCost() = 0;
};

template <typename T>
class Der : public Transition<T>
{
public:
  T getCost() override {
  }
};

template < class Transition >
class State;

template <template <typename> class TransitionCl, typename Cost>
class State <TransitionCl<Cost>> {
public:
        State(){
            static_assert(
                std::is_base_of< Transition< Cost >, TransitionCl<Cost> >::value,
                "TransitionCl class in State must be derived from Transition< Cost >"
            );
        }
};

int main()
{
  Der<int> d;
  State<decltype(d)> s;

  return 0;
}

答案 1 :(得分:1)

一种方法是使用getCost()的返回类型(但如果TransactionCl()没有这样的公共成员函数,它可能会给你一个更糟糕的错误。)

std::is_base_of< Transition< decltype(TransitionCl().getCost()) >, TransitionCl >::value,

另一个选择是向基类添加typedef

template < class Cost >
class Transition {
  public:
    typedef Cost Cost_Type;    // <-------
    virtual Cost getCost() = 0;
};

然后,您可以移除State的{​​{1}}参数,并在静态断言中使用typename Cost ...

typedef