[英]Class templated member function and return type inference
我想使用C ++ 11自动小说明符来推断我的返回类型,但是我尝试使用它的示例与它的典型用法有点不同。
我有一个基类,以及派生某些成员函数的子类。
enum class state {composite1, composite2, composite3};
class material
{
public:
}
class sub_material1 : material
{
public:
template<typename T>
T* transform(state to_state)
{
T* material;
switch(to_state){
case(state::composite1) :
//do transform computations
// set material to return
material = some_transformed_material;
break;
case(state::composite2):
// do transform computation
// set material to return
material = some_transformed_material;
break;
.
.
.
.
}
return material;
}
}
所以如果我有类似的东西
sub_material1 mat1;
sub_material2 mat2;
mat2 = mat1.transform(state::composite2);
考虑到我要测试的条件可能会非常漫长.... decltype似乎是一个过大的杀伤力,在这种情况下,我如何使用auto和decltype?
如何推断类型?
谢谢
此代码将不起作用。 编译器无法根据返回类型推断出模板参数,因此您应该手动设置:
auto mat2 = mat1.transform<sub_material2>(state::composite2);
如果在之前声明了mat2:
sub_material2 *mat2;
mat2 = mat1.transform<sub_material2>(state::composite2);
您正在尝试混合使用指针和非指针类型。
我建议您尝试以下方法:
struct composite1 {};
struct composite2 {};
struct composite3 {};
class material
{
public:
}
class sub_material1 : material
{
public:
sub_material1 transform(composite1)
{
//do transform computations
// set material to return
return some_transformed_material;
}
sub_material2 transform(composite2)
{
//do transform computations
// set material to return
return some_transformed_material;
}
.
.
.
.
}
那么你可以这样:
sub_material1 mat1;
auto mat2 = mat1.transform(composite2{});
要么
sub_material1 mat1;
sub_material2 mat2;
mat2 = mat1.transform(composite2{});
如果愿意,可以返回指针,但是mat2应该是sub_material2 *类型。
如果还需要以下内容:
sub_material3 ma3 ;
mat3 = mat1.transform(state::composite3)
那么答案是:你做不到。 编译器必须在编译时知道要调用哪个版本的转换。 您可以执行以下操作:
template <enum class state>
struct state_material
{
typedef type sub_material1 ;
} ;
然后专攻
template <>
struct state_material<state::composite1>
{
typedef type sub_material1 ;
} ;
template <>
struct state_material<state::composite2>
{
typedef type sub_material2 ;
} ;
template <>
struct state_material<state::composite3>
{
typedef type sub_material3 ;
} ;
然后像这样调用:
mat2 = mat1.template transform<state_material<state::composite2>::type>()
当前形式的代码根本无法使用, auto
和decltype
都不会对这里有太大帮助。 编译器无法推断T的实际类型是什么。 因此,在调用transform
时必须指定该类型是什么:
mat2 = mat1.transform<sub_material2>(state::composite2);
但是,仍然存在一个问题: transform
返回T*
,而不是T
,也就是说,除非您将mat2
声明为sub_material2*
类型,否则赋值将不起作用。
如果该方法可以基于运行时参数返回不同类型的资料,则您将必须例如返回一个指向基类material
的对象的指针。 模板用于制定编译时决策,但是您的方法看起来像是在制定运行时决策!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.