相关疑难解决方法(0)

在c ++中通过引用传递可选参数

我在C++中遇到了可选函数参数的问题

我要做的是编写带有可选参数的函数,该函数通过引用传递,这样我就可以用两种方式(1)和(2),但是(2)我真的不在乎什么是的价值mFoobar.

我试过这样的代码:

void foo(double &bar, double &foobar = NULL)
{
   bar = 100;
   foobar = 150;
}

int main()
{
  double mBar(0),mFoobar(0);

  foo(mBar,mFoobar);              // (1)
  cout << mBar << mFoobar;

  mBar = 0;
  mFoobar = 0;

  foo(mBar);                     // (2)
  cout << mBar << mFoobar;

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

但它崩溃了

void foo(double &bar, double &foobar = NULL)
Run Code Online (Sandbox Code Playgroud)

有消息:

error: default argument for 'double& foobar' has type 'int'
Run Code Online (Sandbox Code Playgroud)

没有函数重载可以解决它吗?

c++ pass-by-reference optional-parameters

30
推荐指数
6
解决办法
5万
查看次数

C++ 11:如何定义一个接受特定类型对象的通用引用的函数?

问题:我正在用C++ 11开发一个程序.我想写一个接受右值引用和左值引用的函数.(即普遍参考).

以下函数接受通用引用参数:

template<class T> void function(T&& t){/*SNIP*/}
Run Code Online (Sandbox Code Playgroud)

但是,它接受所有类型的参数.它破坏了功能的类型安全性.如果我希望它接受特定类型的参数,我该怎么办?

这是我能想到的解决方案:

void function(Class& t){/*SNIP*/}
void function(Class&& t){ function(t); }
Run Code Online (Sandbox Code Playgroud)

但是,它很难看.如果我想更改要接受的参数,或更改函数名称,我必须更新该函数的两个版本.它有比这更好的等价物吗?

编辑:问题解决了.你们两个都回答得很好.我已经对两个答案都投了+1,以表达我的感激之情.我将把这个问题留下几天.得票最多的答案将被接受.

EDIT2:我最终得到以下代码:

template < class T,
class=typename std::enable_if<std::is_same<Class, typename std::decay<T>::type>::value>::type //Dummy template parameter
>
void function(T&&){}
Run Code Online (Sandbox Code Playgroud)

EDIT3:我为此编写了一个宏定义:

#define uRefType(T, typeLimit) class T, class=typename std::enable_if<std::is_same<typename std::decay<T>::type, typeLimit>::value>::type
Run Code Online (Sandbox Code Playgroud)

用法示例:

template< uRefType(T, Class) > void function(T&&){}
Run Code Online (Sandbox Code Playgroud)

c++ c++11

5
推荐指数
1
解决办法
342
查看次数