我有一个处理任何容器类型的接口.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团队查询.
我最近遇到(至少我认为是)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) 我的计划是在_includes目录中包含文件夹:
_包括/页脚
_includes / heros
_includes / cta
等等...
当我引用时,{% include footers/footer1.html %}出现以下错误:
Liquid Exception: Included file '_includes/footers/footer1.html' not found in _layouts/default.html
这是否超出了预期的功能范围,还是我错过了一些东西?
据我所知,在MVS 2013中包含并支持UDL.
我曾尝试过这样的事情:
myclass operator"" _suffix();
int operator"" _suffix();
Run Code Online (Sandbox Code Playgroud)
上述两行都给出了错误"",说它预计会有运营商.我的猜测是项目设置有问题,因为代码应该工作,MVS13支持UDL.
可能是什么问题,我该如何解决?
我有一个继承自的模板类(从现在开始作为父级引用).
模板类初始化包含子类中指定的类和构造函数的融合列表成员变量.
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) #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"文本将在哪里消失,因为它没有输出流?是否存在用于插入无用的数据的虚拟流?
我想通过一个例子来解释我的问题。我正在使用第三方库,有自己的命名空间。我想导入这个库的一部分,在下面提到的命名空间内有自己的命名空间。
\n\nnamespace library {\n namespace part {\n }\n}\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n\n该场景可以用该语言当前的工具来完成吗?如果不是,应该如何解决?还是不行,为什么?
\n\n编辑:错误消息 gcc 5.3.0 转储:
\n\n\n\n\n错误:命名空间 \xe2\x80\x98project::my_part\xe2\x80\x99 的声明冲突
\n
编辑:有一个关于扩展原始名称空间的建议,但我正在要求。Library::part用户不应直接访问我添加的功能。
\n我有一个脑死亡的时刻.
我必须将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转换为该字符串表示就可以了.
我正在尝试使用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 ++的项目(使用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设置不正确,但是我不知道我在做什么错。
有没有办法在测试中检查变量的状态是什么?谁能发现我在做什么错?