c++ - 类模板化成员函数和返回类型推断

标签 c++ templates c++11

我想使用 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/

相关文章:

c++ - 为什么我在编译时遇到 Mammal.h 类错误

c++ - 将终端对 bash 命令的响应读入 C++ 变量

C++11 通用初始化导致意外初始化?

c++ - c++ 中的函数引用

c++ - 获取参数包中的参数类型

c++ - 如何将 std::set 的元素添加到另一个非空集?

c++ - C++11 中 RAW 指针的智能 vector ?

C++模板模板中的此类分配是什么意思?

javascript - 如何刷新 Handlebars 模板上下文/数据?

templates - Visual Studio 2012/2013 XSL XPATH 项目