小编Mik*_*han的帖子

type_traits - 连续的内存

我有一个处理任何容器类型的接口.std::vector,std::array甚至std::basic_string.问题在于没有什么可以阻止某人传递没有连续内存的容器.

我当前的解决方案是delete我想要阻止的那些接口.

void dosoemthing(const std::list&)=delete;
void dosoemthing(const std::map&)=delete;
Run Code Online (Sandbox Code Playgroud)

但是,如果我可以根据类型特征添加静态断言,我更愿意.这引出了我的问题.它们是否存在容器的类型特征,可用于识别其内存是否连续?我一直在阅读文档,还没有找到任何东西.我想在将它标记为失败的原因之前我会向A团队查询.

c++ c++11

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

构造std :: tuple时MSVC中的错误行为

我最近遇到(至少我认为是)MSVC++ 2015中的错误行为(哦,什么新闻......)当试图编译下面的代码时(显而易见的简化):

#include <tuple>
#include <functional>

template<typename T>
using Func = std::function<void(T)>;

template<class...Ts>
class Foo
{
public:
    using Tuples = std::tuple<Func<Ts>...>;
    Foo(Tuples arg)
        : m_tuples(arg)
    {}
private:
    Tuples m_tuples;
};

struct Bar
{};

int main() {
    Foo<Bar> foo{std::make_tuple([](Bar) {})};
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

它适用于clang和gcc(支持c ++ 14的新版本和旧版本),但在MSVC++ 2015中,它无法使用非常有趣的错误消息进行编译:

type_traits(1494): error C2893: Failed to specialize function template 'unknown-type std::invoke(_Callable &&,_Types &&...)'
type_traits(1494): note: With the following template arguments:
type_traits(1494): note: '_Callable=std::tuple<std::function<void (Bar)>> &'
type_traits(1494): note: '_Types={Bar}'
Run Code Online (Sandbox Code Playgroud)

第一个奇怪的行为在这里变得明显:为什么编译器试图将元组用作函数对象?进一步在堆栈中变得清晰:它错误地实例化了元素构造函数

template< class... UTypes >
explicit constexpr …
Run Code Online (Sandbox Code Playgroud)

c++ compiler-errors visual-c++ c++11 c++14

5
推荐指数
0
解决办法
322
查看次数

您可以使用Jekyll的_includes文件夹中的子目录吗?

我的计划是在_includes目录中包含文件夹:

_包括/页脚

_includes / heros

_includes / cta

等等...

当我引用时,{% include footers/footer1.html %}出现以下错误:

Liquid Exception: Included file '_includes/footers/footer1.html' not found in _layouts/default.html

这是否超出了预期的功能范围,还是我错过了一些东西?

html ruby jekyll gulp

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

使用Microsoft Visual Studio 2013的C++ 11用户定义的文字

据我所知,在MVS 2013中包含并支持UDL.

我曾尝试过这样的事情:

    myclass operator"" _suffix();
    int     operator"" _suffix();
Run Code Online (Sandbox Code Playgroud)

上述两行都给出了错误"",说它预计会有运营商.我的猜测是项目设置有问题,因为代码应该工作,MVS13支持UDL.

可能是什么问题,我该如何解决?

c++ user-defined-literals c++11 visual-studio-2013

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

继承时删除重复的模板typename条目

我有一个继承自的模板类(从现在开始作为父级引用).

模板类初始化包含子类中指定的类和构造函数的融合列表成员变量.

template<typename... ITEM_TYPES>
using List = boost::fusion::list<ITEM_TYPES...>;

template<typename... CHILDREN_TYPES>
class ElementContainer 
{ 
protected:
    const List<CHILDREN_TYPES...> children;
public:
     ElementContainer(CHILDREN_TYPES&&... args) : children(forward<CHILDREN_TYPES>(args)...) {}
};
Run Code Online (Sandbox Code Playgroud)

子类的示例:

class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
{
public:
    XMLSignatureDocument() :ElementContainer(
        XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
        SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
        )) {};
};
Run Code Online (Sandbox Code Playgroud)

当我创建这样的子类时,我必须在列表中指定类的类型两次:

一旦进入"继承自"规范:

class XMLSignatureDocument : public ElementContainer<XMLDeclarationElement, SignatureXMLElement>
Run Code Online (Sandbox Code Playgroud)

当我指定各个类的构造函数参数时:

XMLSignatureDocument() :ElementContainer(
    XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
    SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
    )) {};
Run Code Online (Sandbox Code Playgroud)

我想只需要指定一次 - 当我还指定构造函数参数时,如下所示:

class XMLSignatureDocument : public ElementContainer<...>
{
public:
    XMLSignatureDocument() :ElementContainer(
        XMLDeclarationElement("<?xml version=\"1.0\" encoding=\"utf-8\"?>"),
        SignatureXMLElement("<Signature xmlns=\"http://www.w3.org/2000/09/xmldsig#\"></signature>"
        )) {}; …
Run Code Online (Sandbox Code Playgroud)

c++ templates boost template-meta-programming c++14

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

当主要退出控制台输出的位置时?

#include<iostream>
#include<thread>
using namespace std;
void func()
{
    for (int i = 0; i < 10000; i++)cout << "Print" << endl;
}

int main()
{
    thread t(func);
    t.detach();
    cout << "Exit" << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,当主要退出时,"Print"文本将在哪里消失,因为它没有输出流?是否存在用于插入无用的数据的虚拟流?

multithreading c++11

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

如何扩展指定的命名空间

我想通过一个例子来解释我的问题。我正在使用第三方库,有自己的命名空间。我想导入这个库的一部分,在下面提到的命名空间内有自己的命名空间。

\n\n
namespace library {\n  namespace part {\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当前项目中也存在层次结构。我想使用另一个名称将库::part导入并扩展到我的项目中。我尝试执行以下操作:

\n\n
#include <library/part>\n\nnamespace project {\n  namespace my_part = library::part;\n}\n\nnamespace project {\n  namespace my_part {\n    void my_extension_1();\n    void my_extension_2();\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该场景可以用该语言当前的工具来完成吗?如果不是,应该如何解决?还是不行,为什么?

\n\n

编辑:错误消息 gcc 5.3.0 转储:

\n\n
\n

错误:命名空间 \xe2\x80\x98project::my_part\xe2\x80\x99 的声明冲突

\n
\n\n

编辑:有一个关于扩展原始名称空间的建议,但我正在要求。Library::part用户不应直接访问我添加的功能。

\n

c++ namespaces c++11 c++14 c++17

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

printf int到带左边填充空格的char数组

我有一个脑死亡的时刻.

我必须将a的字符串表示存储int到a char[],但是ascii表示必须用空格填充.A snprintf会做这个工作.

  char data     [6];
  int msg_len = 10;
  std::snprintf(data, 6, "%*d", 5, msg_len);
  //"   10" <-- OK
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有一种更优雅的方式来做到这一点.我可以访问C++11 还有一个问题,我认为snprintf还会添加一个终止字符,我必须避免这种情况.我可以有一个中间缓冲区并将其复制到我的数据中,但这会增加额外的复杂性.

我需要在适当的位置进行,因为这些数据结构是我必须发送到服务器的消息的一部分,该服务器接受以这种方式格式化的输入.

消息看起来像:

  struct
  {
    char first_field   [6];
    char second_field  [8];
    char data_field    [12];
  };
Run Code Online (Sandbox Code Playgroud)

我可能需要在设置第一个之前设置second_field.此外,我还有更多的字段需要填写,因此我们将非常感谢通用的解决方案.只要我可以将int转换为该字符串表示就可以了.

c++ c++11

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

gcc在+运算符中缩小转换

我正在尝试使用GCC 6编译一些相当简单的C++代码,但是获得了一个缩小的转换警告.这是有问题的,因为我们将警告视为错误.

struct S {
    short int a;
    short int b;
};

short int getFoo();
short int getBar();

std::array<S, 2> arr = {{
    {5, getFoo()},
    {3, getFoo() + getBar()}   // Narrowing conversion here?
}};
Run Code Online (Sandbox Code Playgroud)

您可以在https://godbolt.org/g/wHNxoc上查看此代码.GCC表示getFoo()+ getBar()正在从int缩小到short int.什么导致upcast到int?除了强制转换为短整数之外,还有什么好的解决方案吗?

c++ gcc

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

无法为CTest测试设置环境变量

我的任务是为基于c ++的项目(使用swig)构建python绑定。该项目使用cmake进行构建和ctest测试,并且应该将绑定的构建和测试集成到其中。

我已经建立好工作,手动运行时测试也可以工作,但是我必须设置几个环境变量才能使它们工作,而我无法为自动化过程设置这些变量。

我需要设置LD_LIBRARY_PATH和PYTHONPATH。PYTHONPATH我可以通过在测试脚本中操作sys.path来解决,但是使用LD_LIBRARY_PATH则更难。到目前为止,我在测试目录的CMakelists.txt中添加了以下内容:

#Python wrapper testing

find_package(PythonInterp 3.5 REQUIRED)

if (NOT PYTHONINTERP_FOUND)
  message(STATUS "Python interpreter NOT found")
else(NOT PYTHONINTERP_FOUND)
  message(STATUS "Python interpreter found")
  ADD_TEST(NAME testPyMyproj
       COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/test_scripts/test_pyMyproj.py
       )
  set_property(TEST testPyMyproj PROPERTY ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_BINARY_DIR}/lib/)
endif (NOT PYTHONINTERP_FOUND)
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

ImportError: libMyproj.so: cannot open shared object file: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我的绑定链接到哪个库,并位于所指定的目录中${CMAKE_BINARY_DIR}/lib/

我认为这表示$LD_LIBRARY_PATH设置不正确,但是我不知道我在做什么错。

有没有办法在测试中检查变量的状态是什么?谁能发现我在做什么错?

python swig cmake ctest

4
推荐指数
2
解决办法
2304
查看次数