[英]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.