我在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++ 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)