我正在尝试创建一个函数来检查参数是否是临时值并返回一个布尔值.
让我们称之为isTemp.例子:
int a;
isTemp(a); // this should be false;
isTemp(43); // should be true;
Run Code Online (Sandbox Code Playgroud)
我已经开始使用模板参数的函数,但是这不起作用,现在我不知道该怎么做:
template <typename T>
bool isTemp(T) { return false; }
template <typename T>
bool isTemp(const T) { return true; }
Run Code Online (Sandbox Code Playgroud)
有什么建议?
这是我(简化)尝试实现一个ranges::min_element适用于左值和右值参数的版本:
#include <iterator>
#include <algorithm>
#include <type_traits>
#include <utility>
namespace better_std_ranges
{
template<typename Range>
constexpr auto min_element(Range& range)
{
using std::begin;
using std::end;
return std::min_element(begin(range), end(range));
}
template<typename Range>
constexpr auto min_element(Range&& range)
{
static_assert(!std::is_reference_v<Range>, "wrong overload chosen");
class _result_iterator_type // todo: inherit from some crtp base that will provide lacking operators depending on _underlying_iterator_type::iterator_category
{
using _underlying_iterator_type = std::decay_t<decltype(std::begin(std::declval<Range&>()))>;
public:
explicit constexpr _result_iterator_type(Range&& range) noexcept(std::is_nothrow_move_constructible_v<Range>)
: _underlying_range{std::move(range)}
, _underlying_iterator(::better_std_ranges::min_element(_underlying_range))
{
}
using difference_type = typename _underlying_iterator_type::difference_type;
using …Run Code Online (Sandbox Code Playgroud)