我有几个模板类
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]
答案 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