繁体   English   中英

类模板化的成员函数和返回类型推断

[英]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>()

当前形式的代码根本无法使用, autodecltype都不会对这里有太大帮助。 编译器无法推断T的实际类型是什么。 因此,在调用transform时必须指定该类型是什么:

mat2 = mat1.transform<sub_material2>(state::composite2);

但是,仍然存在一个问题: transform返回T* ,而不是T ,也就是说,除非您将mat2声明为sub_material2*类型,否则赋值将不起作用。

如果该方法可以基于运行时参数返回不同类型的资料,则您将必须例如返回一个指向基类material的对象的指针。 模板用于制定编译时决策,但是您的方法看起来像是在制定运行时决策!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM