小编Tim*_*imW的帖子

使用par_unseq时,我仍然可以依赖输出元素的顺序吗?

阅读文档后,我仍然对使用它感到困惑par_unseq.我知道由于线程和矢量化,我无法说出执行的顺序,但是我仍然可以依赖输出的顺序吗?

transform([x0, x1, x2], f) == [f(x0), f(x1), f(x2)]]
Run Code Online (Sandbox Code Playgroud)

换句话说,这个测试是否会失败?

std::vector<int> xs = {1, 2, 3, 4};
std::vector<int> ys(xs.size());

std::transform(
    std::execution::par_unseq,
    cbegin(xs), cend(xs),
    begin(ys),
    [](int x) { return x*x; });

std::vector<int> expected = {1, 4, 9, 16};
ASSERT_EQ(expected , ys);
Run Code Online (Sandbox Code Playgroud)

c++ algorithm parallel-processing c++17

14
推荐指数
1
解决办法
435
查看次数

专业功能模板与功能重载与类专业化

根据Herb Sutter的这篇文章,我们应该总是选择Class Specializing over Function Overload,而不是专门的功能模板.

原因是

  • 专业化不会超载.重载分辨率仅选择基本模板(或非模板函数,如果有的话).只有在确定要选择哪个基本模板并且锁定了该选项之后,编译器才会查看是否恰好可以使用该模板的合适专用,如果是,则将使用专门化.
  • 我们不能专门的功能模板.

我必须承认,在我阅读这篇文章之前,我曾几次撞到墙上.他为什么不选择我的专业功能...
阅读完文章之后我再也没有使用过专业功能模板.

例:

template <class T> void foo( T t);
Run Code Online (Sandbox Code Playgroud)

我们应该像这样编写foo,这样我们就可以使用类模板而不是函数专用来专门化它.

template<class T> 
struct FooImpl;

template <class T> void foo( T t) {
    FooImpl<T>::foo(t);
}
Run Code Online (Sandbox Code Playgroud)

现在我们可以对模板进行特殊处理,而不必担心过载规则,我们甚至可以将模板专门化为这样的模板:

template<class U, class V> 
struct FooImpl< QMap< U, V > >;
Run Code Online (Sandbox Code Playgroud)


这是个问题.

StackOverflow成员似乎更喜欢专业功能模板?
为什么?因为专业功能模板比过载解决方案和类专业化获得了更多的赞成.
凭借我目前所获得的信息,我发现它有悖常理,因为我知道我能说得对,但我知道跟在我身后的人会碰壁.

已经有一些GOTWCA文章的链接,所以你必须阅读这篇文章.这意味着upvoters必须有一些额外的信息,请站起来赐教.

c++ templates

7
推荐指数
1
解决办法
5790
查看次数

Qt中的接口隔离

我总是尝试应用SOLID原则,我真的很喜欢Qt工具包,但我发现自己一直都在使用单继承规则.

如果使用多重继承,则moc假定第一个继承的类是QObject的子类. 另外,请确保只有第一个继承的类是QObject.

如何组合QObject规则和接口隔离原则的单一继承.
我想用信号和插槽定义接口,但我不允许这样做.

你如何解决这个缺点?

qt interface solid-principles interface-segregation-principle

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

是否有针对boost :: bind的QPointer专门化

boost::bind处理boost::shared_ptr与原始指针相同的方式.

QObject * object(new QObject);
boost::shared_ptr<QObject> sharedObject(new QObject);

bind(&QObject::setObjectName, object, _1)( "name" );
bind(&QObject::setObjectName, sharedObject, _1)( "name" );
Run Code Online (Sandbox Code Playgroud)

我希望有一个boost::bind处理QPointers作为原始指针指针.

QPointer<QObject> guardedObject(new QObject);    
// i want to write it like this
bind(&QObject::setObjectName, guardedObject, _1)( "name" );
//now i have to do it like this
bind(&QObject::setObjectName, bind(&QPointer<QObject>::data, guardedObject), _1)( "name" );
Run Code Online (Sandbox Code Playgroud)

是否有人为此专业化QPointer

如果不是,你知道从哪里开始或需要专门做什么,所以我可以自己做.

c++ qt boost-bind qpointer

2
推荐指数
1
解决办法
401
查看次数