我将有一个类函数来对两种可能的参数类型进行几乎完全相同的操作,比如 foo(TypeA * t) 和 foo(TypeB * t)
有两种场景:1)整个函数是等价的,两种类型的接口(interface)完全一样,我想我可以用一个只是模板定义:
模板
无效 foo(T * t)
2) 接口(interface)会略有不同,在函数中我们应该使用TypeA中的t->x代替TypeB中的t->y,其余的功能应该是等价的。有没有编写两个函数或函数规范的好/干净的方法?
谢谢!
最佳答案
您可以使用 if constexpr
在 C++17 中,所以它会是这样的:
template<typename T>
void foo(T * t)
{
if constexpr (std::is_same_v<std::remove_reference_t<T>, TypeA>)
t->x();
else
t->y();
// the rest of your function
}
或者,您可以简单地将不同的部分分解到您为其创建 2 个模板特化的另一个函数中。
编辑:在这种特殊情况下,它可能只适用于
std::is_same_v<T, TypeA>
因为你不能有指向引用的指针。但一般最好加std::decay_t<T>
或 std::remove_reference_t<T>
就像我上面做的那样。
关于c++ - 类型界面略有不同时模板的正确使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61534185/