Ori*_*ent 5 c++ sfinae c++11 universal-reference
我想int通过r-或l-值(const)引用将参数(某些具体类型,例如)传递给成员函数.我的解决方案是:
#include <type_traits>
#include <utility>
struct F
{
using desired_parameter_type = int;
template< typename X, typename = typename std::enable_if< std::is_same< typename std::decay< X >::type, desired_parameter_type >::value >::type >
void operator () (X && x) const
{
// or even static_assert(std::is_same< typename std::decay< X >::type, desired_parameter_type >::value, "");
std::forward< X >(x); // something useful
}
};
Run Code Online (Sandbox Code Playgroud)
另一个例子是http://pastebin.com/9kgHmsVC.
但它太冗长了.如何以更简单的方式做到这一点?
也许我应该使用叠加std::remove_reference而std::remove_const不是std::decay,但这里只是简化.
如果我正确理解您的问题,您希望有一个函数,其参数是右值引用(如果提供了右值)或左值引用const(如果提供了左值)。
但这个函数会做什么呢?好吧,由于它必须能够处理这两种情况,包括提供左值的情况,因此它不能修改其输入(至少不能修改绑定到参数的输入) - 如果这样做,它将违反引用x的语义const。
但话又说回来,如果它不能改变参数的状态,就没有理由允许右值引用:而应该始终x是左值引用。const左值引用const可以绑定到右值,因此您将被允许传递右值和左值。
如果函数的语义根据传递的内容而不同,那么我会说编写两个这样的函数更有意义:一个采用右值引用,另一个采用对 的左值引用const。