我有以下重载函数:
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.
直接决定变量的类型
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);不执行控制台输出.
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |