【发布时间】:2019-07-24 21:48:45
【问题描述】:
让我们考虑那些模板化的函数
template <typename T> void Func(T* p)
{
printf("pointer ");
Func(*p);
}
template <typename T> void Func(T)
{
printf("type");
}
我想编写它们,以便如果我给一个带有多个指针类型的参数,则以指针类型专门化的函数被递归调用到不再有指针的点,最后调用没有指针的函数。 通常,如果我写
int a;
int* a2 = &a;
int** a3 = &a2;
int*** a4 = &a3;
Func(a4);
我希望输出写入
pointer pointer pointer type
不幸的是,如果我这样写,我得到的只是对非指针函数的调用。
有什么方法可以实现吗?
【问题讨论】:
-
在 C++17 中,您可以完全摆脱一个重载,只需使用
Func(T)使用if constexpr和std::is_pointer来测试T是否是指针,例如:template <typename T> void Func(T param) { if constexpr (std::is_pointer_v<T>) { printf("pointer "); Func(*p); } else { printf("type"); }参见Simplifying templates and #ifdefs with if constexpr,其中有与您类似的示例。 -
注意它是重载,而不是特化。
标签: c++ pointers templates specialization