小编Mik*_*ler的帖子

将CGRect标准化为0到1

标准化CGRect值的最佳方法是什么,使它们在0和1之间(单位坐标系)?

objective-c ios

8
推荐指数
2
解决办法
2046
查看次数

如何忽略作为clang C++模块一部分的头文件中的警告?

我们正在使用clang -fmodule-fcxx-module启用模块支持,如http://clang.llvm.org/docs/Modules.html中所述.通过为我们的核心库定义模块映射,我们已经看到了构建时间的显着改进.

但是,我们有一些库头文件使用编译指示来禁用某些行的警告,例如:

template <typename TFloat>
static bool exactlyEqual(TFloat lhs, TFloat rhs)
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wfloat-equal"
    return lhs == rhs;
#pragma clang diagnostic pop
}
Run Code Online (Sandbox Code Playgroud)

当这头拉在为预编译的模块,它似乎铿锵的内部表示不保留编译信息和警告仍然发出.由于我们将警告视为错误,因此导致编译失败.有些人可能会争辩说float-equal完全禁用,但我们还有其他一些具有不同警告的情况,我们不希望全局禁用.

我们已经在使用-Wno-system-headers,-isystem所以图书馆的客户端通常不会看到这样的警告(即使没有编译指示),但是当标头作为模块导入时,这似乎不起作用.此外,我们仍然会对库内部的代码发出这些警告,其中包含标头作为非系统标头(即不使用-isystem/使用双引号),因为模块预编译和导入也发生在这里.

我尝试使用_Pragma(...)而不是#pragma没有任何影响.

是否有其他方法有条件地忽略来自预编译的clang模块的标题中的警告?

更新:我已经把一个样本项目多达上https://github.com/MikeWeller/ClangModuleWarnings其重现问题

更新:似乎[system]模块属性将禁止所有警告.然而,这甚至会抑制我们在构建库本身时想要看到的警告,并且我们不希望制作所有模块系统模块.如果我们在构建库本身时找到了不使用库模块映射的方法,这可能是可以接受的,但我们仍然希望对非系统模块进行某些警告.

c++ clang llvm-clang clang++

8
推荐指数
0
解决办法
977
查看次数

当引用一次时,编译器是否可以隐式std :: move参数?

假设我有一个带有setter的简单类:

class MyClass
{
public:
    void setName(std::string name)
    {
        _name = std::move(name);
    }

private:
    std::string _name;
};
Run Code Online (Sandbox Code Playgroud)

我在std::move这里使用,但是如果我要省略这个并且只是写_name = name,那么编译器是否会隐式移动name参数,因为它不会在setter中的任何其他地方使用?它几乎可以被视为赋值表达式中的右值,因为它在其他任何地方都没有被名称引用.

编译器可以这样做吗?现有的编译器会这样做吗?

c++ compiler-construction move-semantics c++11

6
推荐指数
2
解决办法
301
查看次数

检测 UITableView 何时被重新排序

我有一个由 NSFetchedResultsController 支持的 UITableView,它可以随时触发更新。如果用户当前正在重新排序行,应用这些更新将导致异常,因为表视图已临时接管,您会收到类似的错误

Invalid update: invalid number of rows in section [...]
Run Code Online (Sandbox Code Playgroud)

如何检测用户何时开始移动单元格,以便延迟由获取的结果控制器引起的更新?似乎没有任何表视图委托方法来检测这一点。这个委托方法:

- (NSIndexPath *)tableView:(UITableView *)tableView targetIndexPathForMoveFromRowAtIndexPath:(NSIndexPath *)sourceIndexPath toProposedIndexPath:(NSIndexPath *)proposedDestinationIndexPath {
Run Code Online (Sandbox Code Playgroud)

当用户最初分离第一个单元格时不会被调用,只有当他们实际将它移动到其他地方时才会调用。

一种解决方案是检查isEditing获取的结果回调并只执行批量操作reloadData而不是动态插入/删除行,但我想知道是否有一种方法可以专门检查“重新排序”模式。

iphone uitableview

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

C++ 中安全异步回调的模式

除了以下代码之外,还有哪些替代方案可以对对象执行安全的异步回调?

class MyClass : public std::enable_shared_from_this<MyClass>
{
private:

    void fetchResults()
    {
        std::weak_ptr<MyClass> weakSelf = shared_from_this();

        m_service.getResultAsync(
            /* args... */,
            /* Callback */
            [weakSelf](Result r)
            {
                auto self = weakSelf.lock();
                if (self)
                {
                    self->workFinishedWithResult(std::move(r));
                }
            });
    }

    void workFinishedWithResult(Result r) { // ... continue workflow }

    std::shared_ptr<Service> m_service;
};
Run Code Online (Sandbox Code Playgroud)

我想避免使用enable_shared_from_this(并避免客户m_service在非常常见的用例中需要它),但如果没有它,似乎很难延长MyClass回调中的一次的生命周期。

相反,在 lambda 中捕获this并尝试在 MyClass 的析构函数中取消注册它,或者阻止 MyClass 在回调完成之前被破坏,会导致竞争、死锁和失去简单性。我几乎可以肯定捕捉“这个”并不安全。

看来,如果 MyClass 要求 ashared_ptr<Service>回调它,它只能保证它保持有效,如果它可以管理或延长自己的生命周期(通过enable_shared_from_this),因为它不知道回调将持续多久。否则,无论谁拥有 ,或者谁知道 和 的生命周期,都必须有责任来MyClass处理这个问题,但这一切都变得非常容易出错且不切实际。ServiceMyClass

看来唯一可行的解​​决方案是: …

c++ asynchronous callback c++11

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

核心数据ANY BETWEEN谓词

我正在尝试创建一个NSPredicate来查找在某个日期范围内包含"会话"的"项目".我一开始尝试了这个:

[NSPredicate predicateWithFormat:@"ANY sessions.date BETWEEN {$STARTDATE, $ENDDATE}"];
Run Code Online (Sandbox Code Playgroud)

但我得到一个例外:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:
   'to-many key not allowed here'
Run Code Online (Sandbox Code Playgroud)

似乎BETWEEN不能以这种方式与ANY一起使用.我也限制使用()和AND子句,这意味着我不能使用类似的东西:

[NSPredicate predicateWithFormat:@"ANY (sessions.date > $STARTDATE && sessions.date < $ENDDATE)"];
Run Code Online (Sandbox Code Playgroud)

如果我尝试,我得到一个解析错误.当然,sessions.date实际上是一个集合,因此并非如此并不是很有意义.

我怎样才能做到这一点?

谢谢

更新:请注意:

[NSPredicate predicateWithFormat:@"ANY sessions.date > $STARTDATE && ANY sessions.date < $ENDDATE"];
Run Code Online (Sandbox Code Playgroud)

是不正确的,因为它返回的项目的会话大于开始日期,而另一个会话小于结束日期,但两者之间没有会话.

iphone core-data nspredicate

4
推荐指数
1
解决办法
4229
查看次数

使用核心数据的枚举

处理帮助表的最佳方法是什么(我认为这是一个更具技术性的词,但它现在正在逃避我)?例如,我的名为Entity的对象具有entity_type属性.该entity_type需要一个字符串描述.我们假设只有少数entity_types可能.

所以我可以看到一些方法:

  1. 拥有另一个Core Data实体对象名称Entity_Type并将其连接到多个,以便我可以轻松获取描述.例如,这将允许我轻松地在UIPickerView中使用.

  2. 我还可以看到为什么#1是一个陷阱,因为稍后我需要做一些像switch/case这样的事情来处理每种类型的特定功能.作为一个核心数据对象,我没有说"id"来执行switch语句.替代方案是硬编码枚举,但那我将如何处理描述?

  3. 也许是两者的结合?

任何有类似情况的建议或经验都会有很大帮助.我试过搜索,但我所有出现的是如何找到CD对象的ID,这是无关紧要的.

iphone core-data ios

4
推荐指数
1
解决办法
3162
查看次数

外部打印功能如何编译

我创建了两个文件,其中第二个文件应该打印一个std :: vector.

那是我的main.cpp:

#include <vector>
int main() {

std::vector<int> vec;
vec.push_back(1);
vec.push_back(2);
vec.push_back(3);
vec.push_back(4);
vec.push_back(5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)

那是print.cpp

#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>

template <typename T> void printVec(T vec) {
std::copy(vec.begin(), vec.end(), std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
}

template void printVec< std::vector<int> >(std::vector<int> t);
Run Code Online (Sandbox Code Playgroud)

我编译了这些文件:

g++ -g main.cpp -o main.o
g++ -g -c print.cpp -o print.o
g++ -o main main.o print.o
Run Code Online (Sandbox Code Playgroud)

并得到以下错误

main.o: In function `_start':
(.text+0x0): multiple definition of `_start'
/usr/lib/gcc/x86_64-linux-gnu/4.6/../../../x86_64-linux-gnu/crt1.o:(.text+0x0): first defined …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

0
推荐指数
1
解决办法
634
查看次数