【发布时间】:2016-01-13 14:03:04
【问题描述】:
最近,我正在为一所学校的作业工作,该作业即将通过使用类和对象来构造一个非常简单的多项式表达式。
我们不必构造 parse function ,所以要构造一个正常的表达式,需要编写很多代码,并且当代码很多时很难辨别。所以我认为这也许是尝试 C++ 模板的一个很好的环境(我真的是 C++ 的新手,所以我对模板不是很有经验,不确定在这种情况下我是否可以使用它。)
例如,我需要实现 OperatorPlus,其声明对应者为std::shared<Expression> OperateurPlus(std::shared<Expression>, std::shared<Expression>)。我想创建template<typename T, typename M> std::shared<Expression> plus(T lhs, M rhs) 包装器来响应不同的传入参数。我按照另一种语言的 where 子句通过使用enable_if 添加类型限制。所以代码是这样的:
template<typename T, typename M,
typename = std::enable_if<(
std::is_same<unsigned int, T>::value ||
std::is_same<char, T>::value ||
std::is_same<std::shared_ptr<Expression>, T>::value) &&
( std::is_same<unsigned int, M>::value ||
std::is_same<std::shared_ptr<Expression>, M>::value ||
std::is_same<char, M>::value)>
>
std::shared_ptr<Expression> plus(T lhs, M rhs){
std::shared_ptr<Expression> t_lhs, t_rhs;
if (std::is_same<T, uint>::value) t_lhs = Nombre::create(uint(lhs));
if (std::is_same<T, char>::value) t_lhs = std::shared_ptr<Expression>(new Variable(char(lhs)));
if (std::is_same<T, std::shared_ptr<Expression>>::value) t_lhs = (std::shared_ptr<Expression>)(lhs);
if (std::is_same<M, uint>::value) t_rhs = Nombre::create(uint(rhs));
if (std::is_same<M, char>::value) t_rhs = std::shared_ptr<Expression>(new Variable(char(rhs)));
if (std::is_same<M, std::shared_ptr<Expression>>::value) t_rhs = (std::shared_ptr<Expression>)(rhs);
return std::shared_ptr<Expression>(new OperateurPlus(t_lhs, t_rhs));
}
我的问题是(std::shared_ptr<Expression>)(lhs) 这部分。我使用了 c 风格的铸造,因为我不知道如何实现这种铸造操作。 IDE 告诉我的 std::shared_ptr 不是指针或引用,如果我尝试了 static_cast> 并且它认为 lhs 是 unsigned int 类型。
所以如果我只是按照编译的提示,我的问题是
如何将模板的类型转换为 std::shared_ptr?或
是否可以将 std::shared_ptr 作为模板参数传递?
【问题讨论】:
-
您可以创建辅助函数,例如
auto make_expression(const std::shared_ptr<Expression>& expr) { return expr; }(如果它已经是一个表达式,则什么都不做),以及将整数提升为Expressions 的其他重载。 -
对于共享指针
std::shared_ptr<Expression> ptr,可以使用std::static_pointer_cast<Expression>(ptr)进行静态转换
标签: templates c++11 casting smart-pointers