我想使用 C++11 auto little specifier 来推断我的返回类型,但我尝试使用它的示例与其典型用法略有不同。
我有一个基类和派生某些成员函数的子类。
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);
在这种情况下我如何使用 auto 和 decltype 鉴于我有条件测试可能会非常冗长....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* 类型。
关于c++ - 类模板化成员函数和返回类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31825427/