if constexpr
您可以为 c++11 或c++17使用标签调度。类似的东西。
template <typename T>
void foo(T&& x)
{
foo(std::addressof(x), typename std::is_lvalue_reference<T>::type{});
}
void foo(void const *value, std::true_type)
{
// do something on lvalue
}
void foo(void const *value, std::false_type)
{
// do something on rvalue
}
您需要保存有关该类型的信息,尽管reinterpret_cast
稍后会保存到该指针。或者更好的建议:
template <typename T>
void foo(T&& x)
{
foo(std::forward<T>(x), typename std::is_lvalue_reference<T>::type{});
}
template <typename T>
void foo(T &&value, std::true_type)
{
// do something on lvalue
}
template <typename T>
void foo(T &&value, std::false_type)
{
// do something on rvalue
}