小编gd1*_*gd1的帖子

为什么使用声明不能解决钻石问题?

请考虑以下代码:

struct A
{
    void f()
    {
    }
};

struct B1 : A
{
};

struct B2 : A
{
};

struct C : B1, B2
{
    void f() // works
    {
        B1::f();
    }
    //using B1::f; // does not work
    //using B1::A::f; // does not work as well
};

int main()
{
    C c;
    c.f();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我恳请你不要复制粘贴标准答案如何解决钻石问题("使用虚拟继承").我在这里问的是为什么在这种情况下使用声明不起作用.确切的编译器错误是:

In function 'int main()':
prog.cpp:31:6: error: 'A' is an ambiguous base of 'C'
  c.f();
Run Code Online (Sandbox Code Playgroud)

我得到的印象是使用声明应该从这个例子开始:

struct A
{
    void f()
    { …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance using-directives subclass diamond-problem

51
推荐指数
3
解决办法
3406
查看次数

为什么非最终的"局部"变量不能在内部类中使用,而是封闭类的非最终字段可以?

Stack Overflow上有一些关于编译器错误的主题,Cannot refer to a non-final variable message inside an inner class defined in a different method解决方案是"将其声明为final并且你已经完成了",但是有了这个理论问题,我想检查一下这个代码无法编译的逻辑原因:

private void updateStatus(String message) {
    Runnable doUpdateStatus = new Runnable() {
         public void run() {
             /* do something with message */
         }
    }
    /* do something with doUpdateStatus, like SwingUtilities.invokeLater() */
}
Run Code Online (Sandbox Code Playgroud)

(解决方案:宣布message为最终),而这一个做:

private String enclosingClassField;
private void updateStatus() {
    Runnable doUpdateStatus = new Runnable() {
         public void run() {
             /* do something with enclosingClassField */
         } …
Run Code Online (Sandbox Code Playgroud)

java

35
推荐指数
3
解决办法
3万
查看次数

这种模板函数重载的情况使我无法理解

#include <iostream>

template<typename T>
struct identity
{
    typedef T type;
};

template<typename T> void bar(T) { std::cout << "a" << std::endl; }
template<typename T> void bar(typename identity<T>::type) { std::cout << "b" << std::endl; }

int main ()
{
    bar(5); // prints "a" because of template deduction rules
    bar<int>(5); // prints "b" because of ...?

    return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

我预计bar<int>(5)至少会产生歧义.这里涉及到关于模板函数重载决策的疯狂规则?

c++ templates language-lawyer overload-resolution

30
推荐指数
1
解决办法
442
查看次数

我保证在向量移动后指向std :: vector元素的指针是有效的吗?

考虑这个例子:

std::vector<int> v1 = { 1, 2, 3 };
const int* i = &v1[1];
std::vector<int> v2(std::move(v1));
std::cout << *i << std::endl;
Run Code Online (Sandbox Code Playgroud)

尽管在许多STL实现中这可能会起作用,但是我可以通过标准保证在std::vector移动a时不执行重新分配,并且内部缓冲区支持v2与以前的内部缓冲区支持相同v1?我无法在互联网上找到这些信息,也无法在标准本身上找到这些信息.

c++ stl move vector c++11

22
推荐指数
1
解决办法
1453
查看次数

如何实现@Singleton注释?

可能是一个重复的问题.但我需要实现类似的东西

@Singleton
public class Person {
}
Run Code Online (Sandbox Code Playgroud)

这将确保只有Person对象的单个实例.

一种方法是使构造函数私有化.但这使Singleton注释变得多余.

我真的无法理解我是否真的可以将对象创建限制为单个对象而不会使构造函数变为私有.

这甚至可能吗?

java

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

自动调整"非视网膜"图像版本的大小

我正在寻找一种解决方案,可以让我免于维护同一图像的两个版本,一个用于Retina显示器(又名@ 2x),另一个用于非Retina显示器.我的目标是仅维护"2x"图像,并且只需单击一下即可调整所有这些图像的"神奇工具",甚至可以在XCode中构建.就像"设置并忘记它".

你能帮助我吗?提前致谢.

xcode

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

如何阻止BlockingQueue为空?

我正在寻找一种方法来阻止,直到BlockingQueue空.

我知道,在多线程环境中,只要有生产者将物品放入其中BlockingQueue,就会出现队列变空的情况,并且在几纳秒之后它就会充满物品.

但是,如果只有一个生产者,那么它可能希望等待(并阻止),直到队列在停止将项目放入队列后为空.

的Java /伪代码:

// Producer code
BlockingQueue queue = new BlockingQueue();

while (having some tasks to do) {
    queue.put(task);
}

queue.waitUntilEmpty(); // <-- how to do this?

print("Done");
Run Code Online (Sandbox Code Playgroud)

你有什么主意吗?

编辑:我知道包装BlockingQueue和使用额外的条件可以解决问题,我只是问是否有一些预先制定的解决方案和/或更好的替代品.

java concurrency blockingqueue

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

boost.python中没有

我正在尝试翻译以下代码

d = {}
d[0] = None
Run Code Online (Sandbox Code Playgroud)

使用boost.python进入C++

boost::python::dict d;
d[0] = ?None
Run Code Online (Sandbox Code Playgroud)

如何在boost.python中获取None对象?

c++ python boost

16
推荐指数
1
解决办法
5742
查看次数

异步通知具有可用项目的BlockingQueue

Object当一些BlockingQueue人有一个项目给我时,我需要异步通知.

我已经在Javadoc和网络上搜索了一个预先制定的解决方案,然后我最终得到了一个(也许是天真的)我的解决方案,这里是:

interface QueueWaiterListener<T> {
    public void itemAvailable(T item, Object cookie);
}
Run Code Online (Sandbox Code Playgroud)

class QueueWaiter<T> extends Thread {

    protected final BlockingQueue<T> queue;
    protected final QueueWaiterListener<T> listener;
    protected final Object cookie;

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener, Object cookie) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = cookie;
    }

    public QueueWaiter(BlockingQueue<T> queue, QueueWaiterListener<T> listener) {
        this.queue = queue;
        this.listener = listener;
        this.cookie = null;
    }

    @Override
    public void run() {
        while (!isInterrupted()) {
            try {
                T item = …
Run Code Online (Sandbox Code Playgroud)

java concurrency blockingqueue

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

使用棘手的lambda表达式的奇怪的未定义行为

我一直在努力解决lambda表达式的一个问题,这个问题正在危害我的一个项目.我找到了一个解决方案,但我想确切地了解它的工作原理和原因,以及它是否可靠.

#include <iostream>
#include <functional>
#include <unordered_map>

typedef std::function<const int&(const int&)> Callback;

int f(int i, Callback callback) {
    if (i <= 2) return 1;
    return callback(i-1) + callback(i-2);
}

int main(void) {

    std::unordered_map<int, int> values;

    Callback callback = [&](const int& i) {
        if (values.find(i) == values.end()) {
            int v = f(i, callback);
            values.emplace(i, v);
        }
        return values.at(i);
    };

    std::cout << f(20, callback) << std::endl;

    return 0;

}
Run Code Online (Sandbox Code Playgroud)

我知道这是计算第20个Fibonacci数的一种疯狂方法,但它是我能够详细说明的最紧凑的SSCCE.

如果我编译上面的代码g++ -O0并执行程序,我得到6765,这实际上是第20个斐波纳契数.如果我编译-O1,-O2或者-O3我得到 …

c++ lambda functional-programming c++11

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