小编Stu*_*etz的帖子

在CMake中,如何解决Visual Studio 2010尝试添加的Debug和Release目录?

我正在尝试使用Visual Studio 2010在几年前构建一个基于CMake的项目,并且我遇到了与项目的输出目录有关的问题.Visual Studio在输出二进制文件时一直非常热衷于添加Debug /和Release /子目录,由于各种原因,我一直非常热衷于删除它们 - 现在我正在使用新版本的CMake和新版本的Visual Studio,CMake中的旧解决方案似乎不再起作用,我正在寻找找到"新"方法.

使用以前版本的CMake(2.6)和以前版本的Visual Studio(2008),我使用了以下内容:

IF(MSVC_IDE)
    # A hack to get around the "Debug" and "Release" directories Visual Studio tries to add
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES PREFIX "../")
    SET_TARGET_PROPERTIES(${targetname} PROPERTIES IMPORT_PREFIX "../")
ENDIF(MSVC_IDE)
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但似乎不再有诀窍.请问有关类似但更新的解决方法是否可以与CMake 2.8.6和Visual Studio 2010一起使用?

c++ cmake visual-studio-2010

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

使用接口继承时为什么动态绑定失败?

在C#中,有谁知道为什么我不能做以下事情?(特别是下面标有"不好!"的行)

interface A
{
    void Add(dynamic entity);
}

interface B : A {}

class C : B
{
    public void Add(dynamic entity)
    {
        System.Console.WriteLine(entity);
    }
}

class Program
{
    static void Main(string[] args)
    {
        B b = new C();
        dynamic x = 23;
        b.Add(23);        // fine
        b.Add((int)x);    // fine
        (b as A).Add(x);  // fine
        //b.Add(x);       // NOT fine!
    }
}
Run Code Online (Sandbox Code Playgroud)

如果调用没有动态绑定,或者我显式地转换到层次结构根的接口,我绝对没有问题,但是动态绑定调用给了我:

Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: No overload for method 'Add' takes '1' arguments
   at CallSite.Target(Closure , CallSite , B , Object …
Run Code Online (Sandbox Code Playgroud)

c# inheritance interface dynamic c#-4.0

25
推荐指数
1
解决办法
1275
查看次数

Matlab到C或C++

我正在使用Matlab进行图像处理项目.我们应该在手机上运行我们的程序(打算成为一个应用程序).然后我们被要求将我们的代码转换为C或C++语言,这样我们就可以了解执行需要多长时间然后选择一个平台.到目前为止,我们还没有弄清楚如何进行这种转换..任何关于如何将Matlab转换为C或C++的想法?

c c++ matlab

21
推荐指数
5
解决办法
5万
查看次数

安全地检查不可重复的IEnumerables是否空虚

有时检查不可重复 的内容是否有用,以查看IEnumerable它是否为空.LINQ Any对此不起作用,因为它消耗了序列的第一个元素,例如

if(input.Any())
{
    foreach(int i in input)
    {
        // Will miss the first element for non-repeatable sequences!
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:我知道在这种情况下没有必要进行检查 - 这只是一个例子!真实世界的例子是Zip对一个IEnumerable可能是空的右手执行.如果它是空的,我想要结果是左手IEnumerable原样.)

我想出了一个看起来像这样的潜在解决方案:

private static IEnumerable<T> NullifyIfEmptyHelper<T>(IEnumerator<T> e)
{
    using(e)
    {
        do
        {
            yield return e.Current;
        } while (e.MoveNext());
    }
}

public static IEnumerable<T> NullifyIfEmpty<T>(this IEnumerable<T> source)
{
    IEnumerator<T> e = source.GetEnumerator();
    if(e.MoveNext())
    {
        return NullifyIfEmptyHelper(e);
    }
    else
    {
        e.Dispose();
        return null;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后可以按如下方式使用:

input = input.NullifyIfEmpty(); …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable .net-4.0 c#-4.0

13
推荐指数
1
解决办法
433
查看次数

这个C++静态分析规则是否有意义?

我正在实现一些C++静态分析规则,其中一个规则禁止函数返回引用或指向函数引用参数的指针,即以下都是不兼容的:

int *f(int& x) { return &x; } // #1
const int *g(const int& x) { return &x; } // #2
int& h(int& x) { return x; } // #3
const int& m(const int& x) { return x; } // #4
Run Code Online (Sandbox Code Playgroud)

为此给出的理由是"它是实现定义的行为,无论引用参数是临时对象还是对参数的引用."

然而,我对此感到困惑,因为C++中的流操作符是以这种方式编写的,例如

std::ostream& operator<<(std::ostream& os, const X& x) {
    //...
    return os;
}
Run Code Online (Sandbox Code Playgroud)

我认为我非常有信心C++中的流操作符通常不会表现出实现定义的行为,所以发生了什么?

根据我目前的理解,我希望#1和#3能够很好地定义,因为temporaries不能绑定到非const引用,所以int& x指的是一个超出范围的实际对象函数,因此返回指向该对象的指针或引用是好的.我希望#2变得狡猾,因为一个临时的本来可以被束缚const int& x,在这种情况下,试图取其地址似乎是一个糟糕的计划.我不确定#4 - 我的直觉是,这也可能是狡猾的,但我不确定.特别是,我不清楚以下情况会发生什么:

const int& m(const int& x) { return x; }
//...
const int& r = m(23);
Run Code Online (Sandbox Code Playgroud)

c++ reference language-lawyer reference-binding

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

在Delphi 5中,Free可以提出例外吗?

在Delphi 5中,我目前编写的代码调用块中的Free多个变量finally,例如

...
finally
    a.Free;
    b.Free;
    c.Free;
end;
Run Code Online (Sandbox Code Playgroud)

这段代码假设Free永远不会引发,因为,例如,如果a.Free提出,内存bc将被泄露.这个假设是否合理?

delphi exception-handling delphi-5

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

手动模拟C++中删除操作符的效果是否正式违法?

我意识到这是不明智的,我不打算这样做,但我很好奇以下是否真的是非法的:

#include <iostream>

struct X
{
    ~X()
    {
        std::cout << "~X()\n";
    }
};

int main()
{
    X *x = new X;
    //delete x;
    x->~X();
    ::operator delete(x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是我的理解,delete x;相当于调用析构函数然后调用::operator delete(x);,但根据标准手动执行此操作是否合法?我知道这在使用placement new时是有效的,但是在非展示位置呢?我的预感是它可能是非法的,因为delete(而不是operator delete)必须为每个人执行new,但我有兴趣知道.

c++ language-lawyer

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

在C中调用函数时的序列点和未定义/未指定的行为

我试图确定我对C中序列点的理解 - 只是想检查一下.目前,我认为(1)是未定义的,而(2)仅仅是未指定的,因为在(2)中,在评估参数gh(因此我们不在i序列点之间修改两次)之后存在序列点,但是参数的评估顺序f仍未指定.我的理解是否正确?

#include <stdio.h>

int g(int i) {
    return i;
}

int h(int i) {
    return i;
}

void f(int x, int y) {
    printf("%i", x + y);
}

int main() {
    int i = 23;
    f(++i, ++i); // (1)
    f(g(++i), h(++i)); // (2)
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

这里的关键点似乎是编译器是否可以自由地在任何一个g或者h被调用之前执行增量- 我从下面的答案中理解它是,尽管我很欣赏确认情况就是这样.

c undefined-behavior sequence-points language-lawyer unspecified-behavior

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

在C#中用单行创建和应用lambda

我希望这不是一个愚蠢的问题,但有没有办法在C#中实现以下类型的东西?

int y = (x => x * x)(9);
Run Code Online (Sandbox Code Playgroud)

我知道我可以这样做:

delegate int Transformer(int x);
Transformer square = x => x * x;
int y = square(9);
Run Code Online (Sandbox Code Playgroud)

但有没有办法更简洁地做同样的事情?如果没有,有什么理由不是吗?

c# c#-4.0

3
推荐指数
1
解决办法
103
查看次数

我可以轻松地创建一个模板函数,它接受任意类型的任意容器并对其进行操作吗?

我正试图让这样的东西起作用:

// This method is wrong, won't work, need your help
template < template <typename T> class U >
void foo(U& u) 
{
  T& blah = *u.begin();
}

int main(int, char**)
{
  vector<int> myVec(4, 10);
  foo<vector<int> >(myVec); // This is how I want to call it, even better if I can leave the parameters out and just do foo(myVec);
  return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)

真的我想要做的是避免以下因为它似乎多余:

template <typename T, typename U>
void foo(U& u)
{
T& blah = *u.begin(); 
}

int main(int, char**) …
Run Code Online (Sandbox Code Playgroud)

c++ templates

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