簡體   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