这些功能相同吗?
template <class T>
void foo(T && t)
{
bar(std::forward<T>(t));
}
template <class T>
void foo2(T && t)
{
bar(std::forward<decltype(t)>(t));
}
template <class T>
void foo3(T && t)
{
bar(std::forward(t));
}
Run Code Online (Sandbox Code Playgroud)
如果是,我可以一直使用这个宏来完美转发吗?
#define MY_FORWARD(var) std::forward<decltype(var)>(var)
Run Code Online (Sandbox Code Playgroud)
或者只是使用
bar(std::forward(t));
Run Code Online (Sandbox Code Playgroud)
我相信foo2并且foo3是一样的,但是我发现人们总是像前进一样使用foo,有没有理由明确写出类型?
据我所知,T和T&&两种不同的类型,但我认为std::forward<T>并std::forward<T&&>始终给予同样的结果?
编辑:
我想使用宏的原因是我想在以下C++ 1y代码上保存一些打字,我在不同的地方有很多类似的代码
#define XLC_FORWARD_CAPTURE(var) var(std::forward<decltype(var)>(var))
#define XLC_MOVE_CAPTURE(var) var(std::move(var))
template <class T, class U>
auto foo(T && func, U && para )
{
auto val = // …Run Code Online (Sandbox Code Playgroud) 是否可以Optional inout在Swift中为函数提供参数?我想这样做:
func testFunc( inout optionalParam: MyClass? ) {
if optionalParam {
...
}
}
Run Code Online (Sandbox Code Playgroud)
...但是当我尝试调用它并通过时nil,它给了我一个奇怪的编译错误:
Type 'inout MyClass?' does not conform to protocol 'NilLiteralConvertible'
Run Code Online (Sandbox Code Playgroud)
我不明白为什么我的类在已经被声明为可选时必须符合某些特殊协议.
如何在可滚动,不可编辑的UITextView中查找哪些文本可见?
例如,我可能需要显示下一段,然后我想找到当前可见的文本范围,并使用它来计算适当的范围,并用于scrollRangeToVisible:滚动文本视图
当我运行单元测试时,我想跳过一些代码(例如我不想[[UIApplication sharedApplication] openURL:..]运行).我正在寻找运行时检查我是否正在运行单元测试.
我知道我已经看过代码检查Objective-C运行时,如果单元测试正在运行,但我再也找不到它了.
例如:
var a = [1, 2, 3] // Ints
var s = ",".join(a) // EXC_BAD_ACCESS
Run Code Online (Sandbox Code Playgroud)
是否可以使连接函数返回"1,2,3"?
扩展Int(或其他自定义类型)以符合某些协议?
我搜索了很多,但没有找到有用的代码或教程.
在我的应用程序中,我有一个可变数组,每60秒更新一次.
数组中的对象由多个视图控制器中的表视图显示.
我只想在数组中的值更改或更新时自动重新加载表视图.
为此,我想在可变数组上添加观察者,即当数组中的值发生变化时,它应该调用特定的方法,例如
-(void)ArrayUpdatedNotification:(NSMutableArray*)array
{
//Reload table or do something
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我试图调用一个返回double使用的方法NSInvocation.但我发现它无法在64位iOS应用程序中运行.它适用于OS X,模拟器 - 32位和64位 - iPad 2和带有32位版本的iPad Air.只有iPad Air设备上的64位版本才有此问题.
这是演示问题的代码:
NSMethodSignature *signature = [NSString instanceMethodSignatureForSelector:@selector(doubleValue)];
for (int i = 0; i < 10; i++) {
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
NSString *str = [NSString stringWithFormat:@"%d", i];
[invocation setTarget:str];
[invocation setSelector:@selector(doubleValue)];
[invocation invoke];
union {
double d;
uint64_t u;
} d;
[invocation getReturnValue:&d.d];
NSLog(@"%lf, %llx", d.d, d.u);
}
Run Code Online (Sandbox Code Playgroud)
预期产出
2013-11-09 22:34:18.645 test[49075:907] 0.000000, 0
2013-11-09 22:34:18.647 test[49075:907] 1.000000, 3ff0000000000000
2013-11-09 22:34:18.648 test[49075:907] 2.000000, 4000000000000000
2013-11-09 22:34:18.649 test[49075:907] …Run Code Online (Sandbox Code Playgroud) 我正在考虑一个与完美转发有一些相似性的问题,但是函数参数没有传递给被调用函数,而是返回.这就是我称之为"完美传递"的原因.
问题如下:
假设我们有一个函数,它通过引用获取一个对象(可能还有一些额外的参数),修改该对象,并返回修改后的对象.这些函数的最着名的例子可能是operator<<和operator>>iostreams一样.
让我们以iostream为例,因为它可以很好地展示我所追求的东西.例如,有时人们喜欢做的一件事是:
std::string s = (std::ostringstream() << foo << bar << baz).str();
Run Code Online (Sandbox Code Playgroud)
当然这不起作用,原因有两个:
std::ostringstream()是一个右值,但是operator<<将左值作为第一个参数
operator<<返回一个ostream&(以及,至少为标准的人实际上是一个basic_ostream<CharT, Traits>&其中CharT与Traits从第一自变量推导出).
因此,我们假设我们要设计插入运算符,以便上述工作(您显然不能对现有运算符执行此操作,但您可以为自己的类执行此操作).显然,该解决方案应具有以下特征:
第一个参数可以接受左值或右值.
返回类型应该与传入的类型相同.但是它当然应该只接受ostreams(即从实例化派生的类basic_ostream).
虽然在这个特定用例中不需要,但我想添加第三个要求:
这个额外的规则是你可以从通过函数传递的rvalue中移动构造(我不知道C++ 11流是否可移动构造,但它是一个更通用的方案,流如同方便的例子).
很明显,在C++ 03中,并不能满足这些要求.但是,在C++ 11中,我们有rvalue引用,这应该可以实现.
这是我的尝试:
#include <iostream>
#include <sstream>
#include <string>
template<typename Ostream> struct is_ostream
{
typedef typename std::remove_reference<Ostream>::type candidate;
typedef typename candidate::char_type char_type;
typedef typename candidate::traits_type traits_type;
typedef std::basic_ostream<char_type, traits_type> basic_ostream;
static const bool value = std::is_base_of<basic_ostream, …Run Code Online (Sandbox Code Playgroud) 我无法实现以下代码
template <class T>
struct Foo
{
std::vector<T> vec;
std::vector<T> getVector() && {
// fill vector if empty
// and some other work
return std::move(vec);
}
std::vector<T> getVectorAndMore() &&
{
// do some more work
//return getVector(); // not compile
return std::move(*this).getVector(); // seems wrong to me
}
};
int main()
{
Foo<int> foo;
auto vec = std::move(foo).getVectorAndMore();
}
Run Code Online (Sandbox Code Playgroud)
问题是我不能getVector在里面打电话,getVectorAndMore因为this它不是右值.为了使代码编译,我不得不转换this为rvalue.
有没有什么好方法可以实现这样的代码?
同 return getVector();
错误信息是
main.cpp:17:16: error: cannot initialize object parameter of …Run Code Online (Sandbox Code Playgroud) 我刚加载了Xcode 6 GM种子.现在我想提交我的应用程序的更新.到目前为止存档工作.但当我点击"提交"时,一旦上传加载栏出现Xcode崩溃.
我需要优胜美地吗?
我不得不从Apple下载Application Loader,因为Xcode找不到它.
c++ ×3
c++11 ×3
objective-c ×3
ios ×2
iphone ×2
swift ×2
arm64 ×1
crash ×1
ipad ×1
nsinvocation ×1
ocunit ×1
optional ×1
submit ×1
uiscrollview ×1
uitableview ×1
uitextview ×1
xcode ×1
xctest ×1