#include <iostream>
using namespace std;
template<typename T>
auto get_value(T t)
{
if constexpr(std::is_pointer_v<T>)
return *t;
else
return t;
}
int main(int argc, char **argv)
{
int a = 10;
int* p = &a;
cout << get_value(a) << ", " << get_value(p) << endl;
return 0;
}
结果:10, 10
================================================================================================
分支判断的方法
一、SFINAE
template<typename T>
std::enable_if_t<std::is_integral_v<T>, T> simpleTypeInfo(T t)
{
cout << "foo<integral T> " << t << '\n';
return t;
}
template<typename T>
std::enable_if_t<not std::is_integral_v<T>, T> simpleTypeInfo(T t)
{
cout << "not integral \n";
return t;
}
二、标签分发(tag dispatching)
template <typename T>
T simpleTypeInfoTagImpl(T t, std::true_type) {
std::cout << "foo<integral T> " << t << '\n';
return t;
}
template <typename T>
T simpleTypeInfoTagImpl(T t, std::false_type) {
std::cout << "not integral \n";
return t;
}
template <typename T>
T simpleTypeInfoTag(T t) {
return simpleTypeInfoTagImpl(t, std::is_integral<T>{});
}
三、编译时if(if constexpr)
template <typename T>
T simpleTypeInfo(T t) {
if constexpr (std::is_integral_v<T>) {
std::cout << "foo<integral T> " << t << '\n';
}
else {
std::cout << "not integral \n";
}
return t;
}