gpt4 book ai didi

c++ - 我如何定义一个只绑定(bind) xvalue 或 prvalue 而不是两者的函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:44:26 28 4
gpt4 key购买 nike

有没有办法定义一个只处理 xvalue 或 prvalue 的函数(或者这里是异或)?

例如,假设我有一个方法 f(foo&& f),我如何声明 f 绑定(bind) xvalue 类型并拒绝 prvalue 类型,反之亦然?

struct Foo{};
void xvalue(/*what put here ?*/){}
void prvalue(/*what put here ?*/){}

void main()
{
Foo foo;

prvalue(Foo());//compile
prvalue(std::move(foo)));//fail at compilation

xvalue(std::move(foo)); //compile
xvalue(Foo());//fail at compilation
}

也许通过使用 std::enable_if 以及 decltype(e) 是 xvalues 的右值引用类型和 prvalue 的非引用类型这一事实?

最佳答案

使用此 answer 中的代码它应该是微不足道的。

#include <type_traits>
#include <iostream>
#include <utility>

template <typename T>
bool is_xvalue()
{
if (std::is_lvalue_reference<T>::value)
return false;
else if (std::is_rvalue_reference<T>::value)
return true;
return false;
}

template <typename T>
bool is_prvalue()
{
if (std::is_lvalue_reference<T>::value)
return false;
else if (std::is_rvalue_reference<T>::value)
return false;
else
return true;
return false;
}

struct Foo {};

int main()
{
std::cout << std::boolalpha;
std::cout << is_prvalue<decltype(Foo())>() << "\n"; // true
std::cout << is_prvalue<decltype(std::move(Foo()))>() << "\n"; // false
std::cout << is_xvalue<decltype(Foo())>() << "\n"; // false
std::cout << is_xvalue<decltype(std::move(Foo()))>() << "\n"; // true
return 0;
}

不幸的是,您必须显式地实例化模板,否则它会因为某些原因而无法工作。

struct Foo {};

template <typename T, typename = typename std::enable_if<is_prvalue<T>(), void>::type>
void prvalue(T&& t)
{
}

template <typename T, typename = typename std::enable_if<is_xvalue<T>(), void>::type>
void xvalue(T&& t)
{
}

prvalue<decltype(Foo())>(Foo());
// prvalue<decltype(std::move(Foo()))>(std::move(Foo())); - compile error
xvalue<decltype(std::move(Foo()))>(std::move(Foo()));
// xvalue<decltype(Foo())>(Foo()); - compile error

关于c++ - 我如何定义一个只绑定(bind) xvalue 或 prvalue 而不是两者的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20799189/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com