【发布时间】:2013-05-04 16:35:57
【问题描述】:
我想通过 r- 或 l- 值 (const) 引用将参数(某些具体类型,例如 int)传递给成员函数。我的解决方案是:
#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
}
};
另一个例子在这里http://pastebin.com/9kgHmsVC。
但它太冗长了。如何以更简单的方式做到这一点?
也许我应该使用std::remove_reference 和std::remove_const 的叠加而不是std::decay,但这里只是简化了。
【问题讨论】:
-
通过右值传递像
int这样的简单类型是没有意义的。在更一般的情况下,我相信 C++11 对此有一个特殊情况,其中右值参数将被读取为右值 或 左值参数。不过,我不记得适用的确切情况。 -
所以您希望
x成为右值引用(如果传递了右值引用)或对const的左值引用?我的理解是否正确,X&&不会被您接受,因为当传递左值时,它将是对非const的左值引用? -
啊,我们开始吧,我相信您正在尝试这样做:thbecker.net/articles/rvalue_references/section_07.html,这将在下一页使用右值进行解释。如果我误解了这个问题,请大喊。
-
@AndyProwl 我的问题是如何提供一些 concrete 类型但具有非特定“参考性”的参数。
-
@Dukales:我跟不上你。如果你只是做
template<typename X> void operator () (X&& x)你将被允许传递任何参数(左值或右值)。给定U类型的参数,如果参数是右值,类型推导将使x成为U&& x,如果参数是左值,则类型推导将成为U& x
标签: c++ c++11 sfinae universal-reference