小编Sta*_*ked的帖子

通过const&或&&传递模板args

我有这个示例程序:

#include <iostream>

template<typename Message, typename Decoration, typename PrintImpl>
void print_surrounded(Message&& msg, const Decoration& decoration, const PrintImpl& print_impl)
{
    print_impl(decoration); // should forward be used?
    print_impl(" ");
    print_impl(std::forward<Message>(msg));
    print_impl(" ");
    print_impl(decoration);
}

template<typename Message, typename PrintImpl>
void pretty_print(Message&& msg, const PrintImpl& print_impl)
{
    print_surrounded(std::forward<Message>(msg), "***", print_impl);
}

int main()
{
    pretty_print("So pretty!", [](const char* msg) {
        std::cout << msg;
    });
}
Run Code Online (Sandbox Code Playgroud)

我也把它发布在Coliru上.

如您所见,我使用不同的方式传递参数:

  • 消息作为通用引用传递,因为它最终需要转发到PrintImpl函数.
  • 装饰在这里作为const ref传递,因为它的值被使用了两次,我不确定使用前进两次是否安全.(可能会被第一个前锋搬走?)
  • PrintImpl作为const引用传递,因为我没有看到任何使用forward的理由.但是,我不确定这是否明智.(我应该经过&&吗?如果是,我还应该使用std::forward吗?)

我做出了正确的选择吗?

c++ c++11

12
推荐指数
1
解决办法
347
查看次数

关于Haskell中monad的一些问题

我正在学习monads并且有一些问题.

这就是我现在所处的位置.请纠正我错在哪里.

  • >>=标志为中缀运算符.中缀运算符是带有两个参数(左侧和右侧)并返回值的函数.

  • >>=符号称为绑定运算符并具有签名Monad m => m t -> (t -> m u) -> m u.但是,这些类型似乎没有排在这里.我们得到一个类型的值,m t第二个参数是一个带有a的函数t.(我不知道如何连接点.)

  • 这必定意味着绑定功能,在某种程度上能够去除mm t为了得到t并把它传递给函数.

这是我的问题:

  • 是否能够mm t仅在此类绑定运算符内部执行的操作中删除.这个绑定运算符是否有一些特殊的特权?

  • 它与状态变化有什么关系?我理解(我认为)monad的目标是"包装"副作用,以便它们与程序的其余部分隔离开来.但是绑定运算符在这方面的作用是什么?

monads haskell

11
推荐指数
3
解决办法
1371
查看次数

改进我的第一个Clojure计划

经过几个周末探索Clojure后,我想出了这个程序.它允许您在窗口中移动一个小矩形.这是代码:

(import java.awt.Color)
(import java.awt.Dimension)
(import java.awt.event.KeyListener)
(import javax.swing.JFrame)
(import javax.swing.JPanel)

(def x (ref 0))
(def y (ref 0))

(def panel
  (proxy [JPanel KeyListener] []
    (getPreferredSize [] (Dimension. 100 100))
    (keyPressed [e]
      (let [keyCode (.getKeyCode e)]
        (if (== 37 keyCode) (dosync (alter x dec))
        (if (== 38 keyCode) (dosync (alter y dec))
        (if (== 39 keyCode) (dosync (alter x inc))
        (if (== 40 keyCode) (dosync (alter y inc))
                            (println keyCode)))))))
    (keyReleased [e])
    (keyTyped [e])))

(doto panel
  (.setFocusable true)
  (.addKeyListener panel)) …
Run Code Online (Sandbox Code Playgroud)

clojure

11
推荐指数
2
解决办法
1239
查看次数

以编程方式获取链接速度?

我正在编写一个报告本地计算机上网络设备属性的应用程序.我需要mac地址,mtu,链接速度和其他一些.我正在使用udev.我已经弄清楚如何获取mac地址和mtu,但不知道如何获得链接速度.我可以从终端使用ethtool获取它,但我需要一种方法来以编程方式获取它.

有谁知道如何使用udev或其他库获取链接速度属性?

linux udev

11
推荐指数
2
解决办法
2万
查看次数

如何使用size参数初始化std :: vector并使每个对象独立构造?

我喜欢创建具有给定大小和值的向量,例如:

std::vector<std::string> names(10);
Run Code Online (Sandbox Code Playgroud)

然而,这几次导致了意想不到的结果.例如,在以下代码中,每个代码都UniqueNumber具有相同的值:

#include <iostream>
#include <string>
#include <vector>


struct UniqueNumber
{
    UniqueNumber() : mValue(sInstanceCount++)
    {
    }

    inline unsigned int value() const
    {
        return mValue;
    }

private:
    static unsigned int sInstanceCount;
    unsigned int mValue;
};


int UniqueNumber::sInstanceCount(0);


int main()
{
    std::vector<UniqueNumber> numbers(10);
    for (size_t i = 0; i < numbers.size(); ++i)
    {
        std::cout << numbers[i].value() << " ";
    }
}
Run Code Online (Sandbox Code Playgroud)

控制台输出:

0 0 0 0 0 0 0 0 0 0
Run Code Online (Sandbox Code Playgroud)

在查看std :: vector的构造函数时它确实有意义:

explicit vector(size_type __n, …
Run Code Online (Sandbox Code Playgroud)

c++

11
推荐指数
1
解决办法
1万
查看次数

你为什么有时需要写'typename T`而不只是`T`?

我正在阅读有关SFINAE的维基百科文章,并遇到以下代码示例:

struct Test 
{
    typedef int Type;
};

template < typename T > 
void f( typename T::Type ) {} // definition #1

template < typename T > 
void f( T ) {}                // definition #2

void foo()
{
    f< Test > ( 10 ); //call #1 

    f< int > ( 10 );  //call #2 without error thanks to SFINAE
}
Run Code Online (Sandbox Code Playgroud)

现在我实际上已经编写了这样的代码,并且在某种程度上直觉上我知道我需要输入"typename T"而不是"T".但是,了解它背后的实际逻辑会很高兴.有人在乎解释吗?

c++ sfinae

10
推荐指数
2
解决办法
1786
查看次数

如何在Qt中实现基于GStreamer的视频小部件?

我想使用Qt创建一个可以播放本地视频文件的简单GUI应用程序.我可以使用Phonon完成幕后的所有工作,但我需要更多的控制.我已经使用decodebin和autovideosink元素成功实现了GStreamer管道.现在我想使用Qt小部件将输出引导到.

有没有人成功过这样做?(我想是因为有基于Qt的视频播放器建立在GStreamer之上.)有人能指出我正确的方向如何做到这一点吗?

注意:此问题类似于我之前发布的有关如何将Qt与传入RTP流连接的问题.这似乎非常具有挑战性.我想这个问题会更容易回答.

更新1

Patrice建议使用libVLC非常有用.这是VLC网站上的代码的一个更简洁的版本: Qt + libVLC的示例.但是,我原来的问题仍然存在:如何将GStreamer连接到Qt小部件?

更新2

经过一些实验,我最终得到了这个工作样本.它取决于我自己的小GstSupport库中的GstWidget.hGstWidget.cpp.但请注意,目前仅在Mac版的Qt上进行了测试.

c++ qt gstreamer

10
推荐指数
2
解决办法
2万
查看次数

关于RAII:如何防止意外创建临时错误?

有一段时间,一位同事告诉我,他花了很多时间来调试竞争条件.罪魁祸首竟然是这样的:

void foo()
{
    ScopedLock(this->mutex); // Oops, should have been a named object.
                             // Edit: added the "this->" to fix compilation issue.
    // ....
}
Run Code Online (Sandbox Code Playgroud)

为了防止情况再次发生,他在定义ScopedLock类之后创建了以下宏:

#define ScopedLock(...) Error_You_should_create_a_named_object;
Run Code Online (Sandbox Code Playgroud)

这个补丁工作正常.

有没有人知道任何其他有趣的技术来防止这个问题?

c++

10
推荐指数
2
解决办法
703
查看次数

为什么在我的测试程序中`std :: copy` 5x(!)比`memcpy`慢?

这是我发布此程序的这个问题的后续行动:

#include <algorithm>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <vector>
#include <chrono>

class Stopwatch
{
public:
    typedef std::chrono::high_resolution_clock Clock;

    //! Constructor starts the stopwatch
    Stopwatch() : mStart(Clock::now())
    {
    }

    //! Returns elapsed number of seconds in decimal form.
    double elapsed()
    {
        return 1.0 * (Clock::now() - mStart).count() / Clock::period::den;
    }

    Clock::time_point mStart;
};

struct test_cast
{
    int operator()(const char * data) const
    {
        return *((int*)data);
    }
};

struct test_memcpy
{
    int …
Run Code Online (Sandbox Code Playgroud)

c++ performance benchmarking

10
推荐指数
3
解决办法
5450
查看次数

从中间期货创造未来?

在下面的示例代码中,我想Item从以下内容创建一个对象Component:

struct Component { };

struct Item {
    explicit Item(Component component) : comp(component) {}    
    Component comp;
};

struct Factory {
    static std::future<Item> get_item() {
        std::future<Component> component = get_component();        
        // how to get a std::future<Item> ?
    }

    std::future<Component> get_component();
};
Run Code Online (Sandbox Code Playgroud)

如何从去std::future<Component>std::future<Item>


更新:从问题中删除了我的第一个想法(基于线程)并发布了答案.

c++ c++11

10
推荐指数
2
解决办法
413
查看次数

标签 统计

c++ ×7

c++11 ×2

benchmarking ×1

clojure ×1

gstreamer ×1

haskell ×1

linux ×1

monads ×1

performance ×1

qt ×1

sfinae ×1

udev ×1