小编Sva*_*zen的帖子

Boost :: Python,将元组转换为Python工作,vector <tuple>没有

我已经使用Boost :: Python了一段时间,而且一切都很好.然而昨天我试图找出为什么我认为我注册的特定类型(一个元组)在我尝试从Python访问它时给了我错误.

事实证明,虽然元组实际上已经注册,但是当试图通过std::vector包裹来访问它时,vector_indexing_suite这已经不够了.

我在想,为什么它不起作用?有没有办法让这项工作?我应该尝试用手包裹矢量吗?

以下是我的MVE:

#include <tuple>
#include <vector>

#include <boost/python.hpp>
#include <boost/python/suite/indexing/vector_indexing_suite.hpp>

template <typename T>
struct TupleToPython {
    TupleToPython() {
        boost::python::to_python_converter<T, TupleToPython<T>>();
    }

    template<int...>
    struct sequence {};

    template<int N, int... S>
    struct generator : generator<N-1, N-1, S...> { };

    template<int... S>
    struct generator<0, S...> {
        using type = sequence<S...>;
    };

    template <int... I>
    static boost::python::tuple boostConvertImpl(const T& t, sequence<I...>) {
        return boost::python::make_tuple(std::get<I>(t)...);
    }

    template <typename... Args>
    static boost::python::tuple boostConvert(const std::tuple<Args...> & t) {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ python boost tuples boost-python

27
推荐指数
1
解决办法
1641
查看次数

如果更改了CMAKE_RUNTIME_OUTPUT_DIRECTORY,则CMake无法找到测试

我正在用CMake构建我的项目,我正在尝试为每个模块创建一堆测试套件.显然,如果我修改变量,CMAKE_RUNTIME_OUTPUT_DIRECTORY那么ctest无法找到要运行的测试并失败.

我已经做了一个最小的例子来展示我正在谈论的内容,并且我在Lubuntu 13.10上使用CMake 2.8.11.2运行它.如果有人能告诉我这是一个错误和/或如何解决它,我会很感激.谢谢.

文件CMakeLists.txt:

cmake_minimum_required (VERSION 2.6)
project (Test)

# Put all tests in the test directory, where the sources also are
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/test)

enable_testing()

add_subdirectory (${PROJECT_SOURCE_DIR}/test)
Run Code Online (Sandbox Code Playgroud)

文件测试/ CMakeLists.txt:

cmake_minimum_required(VERSION 2.6)

add_executable(ttest main.cpp)
add_test(ttest ttest)
Run Code Online (Sandbox Code Playgroud)

file test/main.cpp:

int main() {
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在新文件夹中构建后build,可在文件夹中正确创建可执行文件test.make test从build 运行会产生以下输出:

Running tests...
Test project /home/svalorzen/Tests/cmake/build
    Start 1: ttest
Could not find executable ttest
Looked in the following places:
ttest
ttest
Release/ttest
Release/ttest
Debug/ttest
Debug/ttest
MinSizeRel/ttest …
Run Code Online (Sandbox Code Playgroud)

testing cmake

16
推荐指数
2
解决办法
9408
查看次数

Visual Studio 2013(vs120)要求错误的boost库

我正在尝试使用Visual Studio 2013在Windows 7上编译我的一个项目.我已经安装了Boost 1.53并使用cmake设置了解决方案.

现在发生的是现在编译的boost库就是这种形式libboost_*-vc120-mt(-gd)-1_53.lib.在链接器项目选项中,在输入选项卡下,我已经验证了我需要的库,并且实际上编译器能够正确读取它们.

但是,由于某种原因,我完全无法理解,链接器也在尝试查找编译为的库vc110.例如:

error LNK1104: cannot open file 'libboost_filesystem-vc110-mt-gd-1_53.lib'
Run Code Online (Sandbox Code Playgroud)

项目选项中列出的Platform Toolset是"Visual Studio 2013(v120)".我在任何项目选项中都找不到对vc110的引用.你能帮我理解发生了什么吗?

c++ boost linker-errors file-not-found visual-studio-2013

15
推荐指数
1
解决办法
5856
查看次数

匹配继承的成员函数的类型

我有以下剪切的代码,不编译.

#include <iostream>

struct A {
    void foo() {}
};

struct B : public A {
    using A::foo;
};

template<typename U, U> struct helper{};

int main() {
    helper<void (A::*)(), &A::foo> compiles;
    helper<void (B::*)(), &B::foo> does_not_compile;

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

它自&B::foo解析后不编译&A::foo,因此无法与提议的类型匹配void (B::*)().由于这是SFINAE模板的一部分,我用它来检查一个非常具体的接口(我强制使用特定的参数类型和输出类型),我希望这可以独立于继承,同时保持检查的可读性.

我尝试的内容包括:

  • 抛出论证的第二部分:

    helper<void (B::*)(), (void (B::*)())&B::foo> does_not_compile;

    遗憾的是,这并没有帮助,因为第二部分现在不被认为是一个常量表达式,并且失败了.

  • 我已经尝试为变量分配引用,以便检查它.

    constexpr void (B::* p)() = &B::foo; helper<void (B::* const)(), p> half_compiles;

    这个代码被clang 3.4接受,但g ++ 4.8.1拒绝它,我不知道谁是对的.

有任何想法吗?

编辑:由于许多评论要求更具体的问题版本,我会在这里写:

我正在寻找的是一种明确检查类是否尊重特定接口的方法.此检查将用于验证模板化函数中的输入参数,以便它们遵守这些函数所需的合约,以便在类和函数不兼容的情况下(即类型特征类型的检查)预先停止编译.

因此,我需要能够验证我请求的每个成员函数的返回类型,参数类型和数量,常量等.最初的问题是我用来验证匹配的更大模板的检查部分.

c++ match member-pointers sfinae c++11

13
推荐指数
2
解决办法
646
查看次数

未定义的_unwind_resume和__gxx_personality_v0引用

我正在尝试使用JsonCpp库.我在Windows上,使用MinGW和CodeBlocks.

当我在json头中包含任何内容时,我的链接器会崩溃并发出这两个错误.我已经开始环顾四周了,我发现了另外两个基本上描述我问题的问题:

g ++和"未定义引用`__gxx_personality_v0'"的问题

什么是__gxx_personality_v0?

如果我将两个缺失的变量声明为void指针,如下所示,则问题就会消失:

void * __gxx_personality_v0=0;
void * _Unwind_Resume =0;
Run Code Online (Sandbox Code Playgroud)

但是,我不明白为什么会发生这种错误.CodeBlocks已设置为使用migw32-g ++表示cpp文件,并且添加-lstdc ++选项并不能解决问题.选项-fno-exception也没有(我想要例外,请注意,我只是在尝试).

我还在同一个文件中包含一个boost库,不会造成任何问题.

编辑:

错误输出正是我在标题中所说的:在链接期间,我总共获得了22个未定义的_Unwind_Resume和__gxx_personality_v0引用.我的代码是:

#include <boost/algorithm/string.hpp>
#include <include/json/value.h>
//void * __gxx_personality_v0=0;
//void * _Unwind_Resume =0;
int main () {
    std::string str1("Hello world!");
    boost::to_upper(str1);
    Json::Value k;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

只有当我包含/使用JsonCPP库时才会出现错误.取消注释注释行可以解决问题.

命令行输出如下:

mingw32-g++.exe -Wall -fexceptions  -g  -DSFML_DYNAMIC   -IC:\Users\Svalorzen\Documents\Projects\boost_1_49 -IC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -IC:\Users\Svalorzen\Documents\Projects\SFML-1.6\include -IC:\Users\Svalorzen\Documents\Projects\hge181\include  -c C:\Users\Svalorzen\Documents\Projects\test\main.cpp -o obj\Debug\main.o
mingw32-g++.exe -LC:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0 -LC:\Users\Svalorzen\Documents\Projects\SFML-1.6\lib -LC:\Users\Svalorzen\Documents\Projects\hge181\lib  -o bin\Debug\test.exe obj\Debug\main.o   -fno-exceptions -lsfml-graphics -lsfml-window -lsfml-system  C:\Users\Svalorzen\Documents\Projects\jsoncpp-src-0.5.0\libs\mingw\libjson_mingw_libmt.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhge.a C:\Users\Svalorzen\Documents\Projects\hge181\lib\gcc\libhelp.a 
Output size is 1.22 MB
Process terminated with …
Run Code Online (Sandbox Code Playgroud)

c++ mingw exception

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

隐式删除的默认构造函数在C++ 14中有效

我正在为一些没有编译的代码做一些测试,我发现这段代码:

struct A {
    A(int) {};
    virtual void foo() = 0;
};

struct B : public virtual A {
    virtual void bar() = 0;
};

struct C : public B {
    C() : A(1) {}
    virtual void foo() override {}
    virtual void bar() override {}
};

int main() {
    C c;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在C++ 11中无法编译(在g ++ 7.0.1上)‘B::B()’ is implicitly deleted because the default definition would be ill-formed,而在C++ 14中编译成功.

我试图找出C++ 14的哪个新功能允许它工作,但无济于事.cppreference中的描述没有提到任何类似的东西.

为什么这段代码可以用C++ 14编译而不能用C++ 11编译?

c++ default-constructor c++11 c++14

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

获取轴上numpy.argmax元素的索引

我有N维矩阵,其中包含具有N个参数的函数的值.每个参数都有一个离散数量的值.我需要最大化除了一个参数之外的所有参数的函数,从而产生大小等于非最大化参数的值的一维向量.我还需要保存其他参数所采用的值.

为此,我想迭代地应用numpy.max不同的轴来减少矩阵的维数以找到我需要的东西.最终的矢量将取决于我遗漏的参数.

然而,我无法找到最终元素的原始索引(其中包含有关其他参数所采用值的信息).我虽然numpy.argmax以同样的方式使用,numpy.max但我无法获得原始索引.

我正在尝试的一个例子是:

x = [[[1,2],[0,1]],[[3,4],[6,7]]]
args = np.argmax(x, 0)
Run Code Online (Sandbox Code Playgroud)

这回来了

[[1 1]
 [1 1]]
Run Code Online (Sandbox Code Playgroud)

这意味着argmax正在选择原始矩阵中的元素(2,1,4,7).但如何获得他们的指数?我尝试unravel_index使用args直接作为矩阵的索引x,从numpy到索引的一堆函数没有成功.

使用numpy.where不是解决方案,因为输入矩阵内部可能具有相等的值,因此我无法从不同的原始值中辨别出来.

python arrays indexing numpy argmax

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

CMake 通配生成的文件

我使用它是asn1c为了从一个或多个.asn1文件生成一系列文件.h并将.c其放入给定的文件夹中。

这些C 文件的名称与原始文件没有对应关系asn1

这些文件必须与我的文件链接在一起才能获得有效的可执行文件。我希望能够:

  • 自动在构建目录中生成文件,以避免污染项目的其余部分(可能用 完成add_custom_target
  • 指定我的可执行文件对这些文件的依赖关系,以便asn1c在文件丢失或其中一个.asn1文件已更新时自动运行可执行文件。
  • 自动将所有生成的文件添加到我的可执行文件的编译中。

由于预先不知道生成的文件,因此可以仅全局显示命令输出目录的内容asn1c- 只要该目录不为空,我就很高兴。

dependencies code-generation glob cmake

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

模板模板部分特化仅与-std = c ++ 1z一起使用g ++

我发现以下一段代码:

#include <iostream>
#include <vector>

template <typename T>
struct X : std::false_type {};

template <template <typename> class Y, typename U>
struct X<Y<U>> : std::true_type {};

int main() {
  if (X<int>())
    std::cout << "wrong\n";

  if (X<std::vector<double>>())
    std::cout << "correct\n";

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

correct在使用g++-7with 编译时打印-std=c++1z.其它版本g++,clang++或者其他std标志不能产生正确的.

这是当前实现的错误,并且此代码不应该打印任何内容,或者是否在C++ 17中发生了变化,这使得此代码按预期工作?

c++ templates g++ clang++ c++17

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

std::pair 仅使用一个初始化器列表参数对非平凡类进行初始化

考虑以下代码:

#include <utility>
#include <vector>

using V = std::vector<int>;

int main() {
    std::pair<int, V> p1{1, 2};   // p1.second has 2 elements
    std::pair<int, V> p2{1, {2}}; // p2.second has 1 element

    std::pair<V, V> p3{2, 2};     // Both vectors have 2 elements
    std::pair<V, V> p4{{2}, {2}}; // Both vectors have 1 element

    std::pair<V, V> p5{2, {2}};   // Does not compile
    // p5.first should have 2 elements, while the other should have 1
}
Run Code Online (Sandbox Code Playgroud)

我的主要问题是最后一行 ,p5它不能编译,g++-12但可以编译g++-10。我想知道:

  • 是什么发生了变化导致了这个问题? …

c++ initialization language-lawyer std-pair c++20

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