借助模板避免函数重载

sha*_*are 3 c++ templates

我有以下重载函数:

float myFunc(Vector2D vec) {
  Temp2D temp;
  for (int i = 0; i < 10; i++) {
    temp += computeTemp(vec, i);
  }
  return temp.compute_a_float();   
}

float myFunc(Vector3D vec)  {
  Temp3D temp;
  for (int i = 0; i < 10; i++) {
    temp += computeTemp(vec, i);
  }
  return temp.compute_a_float();
}

float myFunc(Vector4D vec)  {
  Temp4D temp;
  for (int i = 0; i < 10; i++) {
    temp += computeTemp(vec, i);
  }
  return temp.compute_a_float();
}
Run Code Online (Sandbox Code Playgroud)

其中computeTemp也为Vector2D,Vector3D,Vector4D重载:

Temp2D computeTemp(Vector2D, int);
Temp3D computeTemp(Vector3D, int);
Temp4D computeTemp(Vector4D, int);
Run Code Online (Sandbox Code Playgroud)

为了避免代码重复,我提出了添加一个抽象层的想法:

template<typename T0, typename T1>
float myFunc(T0 vec) {
  T1 temp;
  for (int i = 0; i < 10; i++) {
    temp += computeTemp(vec, i);
  }
  return temp.compute_a_float();   
}

float myFunc(Vector2D vec) {
  return myFunc<Vector2D, Temp2D>(vec);
}
float myFunc(Vector3D vec)  {
  return myFunc<Vector3D, Temp3D>(vec);
}
float myFunc(Vector4D vec)  {
  return myFunc<Vector4D, Temp4D>(vec);
}
Run Code Online (Sandbox Code Playgroud)

不过,我想知道是否有可能避免抽象的附加层,直接决定变量的类型temp在myFunc.

son*_*yao 7

直接决定变量的类型temp在myFunc.

您可以使用它decltype来确定类型,例如

template<typename T0>
float myFunc(T0 vec) {
  decltype(computeTemp(vec, 0)) temp;
  for (int i = 0; i < 10; i++) {
    temp += computeTemp(vec, i);
  }
  return temp.compute_a_float();   
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句,

1.注意,如果computeTemp通过引用返回而不是按值返回,则结果类型decltype也将是引用(对于左值或右值,取决于computeTemp返回方式); 您可能需要使用std::remove_reference与decltype得到你想要的类型.

2.用于的表达式decltype属于未评估的表达式:

四个运算符typeid,sizeof的操作数, noexcept, and decltype (since C++11)是未计算的表达式(除非它们是多态glvalues并且是typeid的操作数),因为这些运算符只查询其操作数的编译时属性.因此,std::size_t n = sizeof(std::cout << 42);不执行控制台输出.

  • @shapeare - 但``decltype()`不计算它; 仅检测返回的类型 (7认同)