小编Zer*_*ero的帖子

在编译时确定整数类型的位数

注意:我在函数的模糊重载中添加了类似但大大简化的问题版本,例如`msg(long)`与候选`msg(int32_t)`和`msg(int64_t)`.该版本具有在单个文件中完整可编译示例的优点.

问题

我有一个C库,其功能类似于

obj_from_int32(int32_t& i);
obj_from_int64(int64_t& i);
obj_from_uint32(uint32_t& i);
obj_from_uint64(uint64_t& i);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,类型int32_t等都是所述std的-它们是实现定义的,在这种情况下字符数组(在下面的例子中我省略转换-它不会改变的问题是有关映射可积类型到基于积分类型中位数的特定函数).

我有第二个C++接口类,它有类似的构造函数

MyClass(int z);
MyClass(long z);
MyClass(long long z);
MyClass(unsigned int z);
MyClass(unsigned long z);
MyClass(unsigned long long z);
Run Code Online (Sandbox Code Playgroud)

注意,我不能用std::int32_t样式类型替换这个接口- 如果我可以,我不需要问这个问题;)

问题是如何obj_from_根据积分类型中的位数调用正确的函数.

提出的解决方案

我提出了两个建议的解决方案,因为没有任何杀手级解决方案浮动到列表的顶部,并且有一些解决方案已被打破.

解决方案1

干杯和赫斯提供.-阿尔夫.从这一点开始的评论是我自己的 - 随意评论和/或编辑.

优点 - 相当简单(至少相比boost::enable_if) - 不依赖于第三方库(只要编译器支持tr1)

*缺点** - 如果需要更多功能(如anotherObj_from_int32等),则需要更多代码

这个解决方案可以在下面找到 - 看看,它很漂亮!

解决方案2

好处

  • 一旦ConvertFromIntegral功能完成后,添加需要转换为有价值的新功能-只需编写一组重载的int32_t, …

c++

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

函数的模糊重载,如`msg(long)`与候选`msg(int32_t)`和`msg(int64_t)`

注意:这与在编译时确定整数类型的位数非常相似,但这是一个非常简化的版本,全部包含在单个版本中.cpp

编辑:添加了一个解决方案 - 虽然给出了一个正确的解释(并被接受),我找到了一种解决问题的方法.

问题

问题在于功能如

 msg(int32_t);
 msg(int64_t);
Run Code Online (Sandbox Code Playgroud)

像这样的电话

long long myLong = 6;
msg(myLong);    // Won't compile on gcc (4.6.3), call is ambiguous
Run Code Online (Sandbox Code Playgroud)

这在MSVC上编译.任何人都可以解释为什么这个失败了gcc(我假设它可能与gcc通常严格符合标准的事实有关)以及如何正确实现相同效果的例子?

#include <iostream>
#include <stdint.h>

#include <boost/integer.hpp>

using namespace std;

void msg(int v) { cout << "int: " << sizeof(int) << ' ' << v << '\n'; }
void msg(long v) { cout << "long: " << sizeof(long) << ' ' << v << '\n'; }
void msg(long long …
Run Code Online (Sandbox Code Playgroud)

c++ gcc

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

使用boost :: spirit解析引用的字符串

我想解析一个句子,其中一些字符串可能不加引号,"引用"或"引用".下面的代码几乎可以工作 - 但它无法匹配收尾报价.我猜这是因为qq参考.修改在代码中被注释,修改引用"引用"或"引用"也解析并帮助显示原始问题与结束引用.该代码还描述了确切的语法.

要完全清楚:不带引号的字符串解析.引用的字符串'hello'将解析打开的引号',所有字符 hello,但然后无法解析最终引用'.

我做了另一次尝试,类似于boost教程中的开始/结束标记匹配,但没有成功.

template <typename Iterator>
struct test_parser : qi::grammar<Iterator, dectest::Test(), ascii::space_type>
{
    test_parser()
        :
    test_parser::base_type(test, "test")
    {
        using qi::fail;
        using qi::on_error;
        using qi::lit;
        using qi::lexeme;
        using ascii::char_;
        using qi::repeat;
        using namespace qi::labels;
        using boost::phoenix::construct;
        using boost::phoenix::at_c;
        using boost::phoenix::push_back;
        using boost::phoenix::val;
        using boost::phoenix::ref;
        using qi::space;

        char qq;          

        arrow = lit("->");

        open_quote = (char_('\'') | char_('"')) [ref(qq) = _1];  // Remember what the opening quote was
        close_quote = lit(val(qq)); …
Run Code Online (Sandbox Code Playgroud)

c++ parsing boost boost-spirit boost-spirit-qi

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

构建一个'长期'

你如何构建一个long longgcc,类似于构建一个intviaint()

gcc中的以下内容失败(4.6.3 20120306)(但以MSVC为例).

myFunctionCall(someValue, long long());
Run Code Online (Sandbox Code Playgroud)

有错误expected primary-expression before 'long'(列位置表示第一个长度是位置).

一个简单的改变

myFunctionCall(someValue, (long long)int());
Run Code Online (Sandbox Code Playgroud)

工作得很好 - 这是构造一个int并转换为long long- 表明gcc不喜欢long longctor.

摘要解决方案

总结下面@birryree的精彩解释:

  • 许多编译器不支持long long(),可能不符合标准
  • 构造long long等同于文字0LL,所以使用myFunctionCall(someValue, 0LL)
  • 可替换地使用typedef long_long_t long long,然后long_long_t()
  • 最后,可以考虑使用uint64_t ,如果你是一个类型,它是在任何平台上正好是64位,而不是一个类型,它是在经过至少 64位,但可以在不同的平台而有所不同.

gcc

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

Binding.SourceUpdated未触发

我有一个有效的绑定.GUI更新.

<DataGridTextColumn Binding="{Binding Path=Value, 
                              NotifyOnTargetUpdated=True, 
                              NotifyOnSourceUpdated=True, 
                              Mode=OneWay}"/>
Run Code Online (Sandbox Code Playgroud)

绑定源对象实现INotifyPropertyChanged,绑定属性是普通的clr属性.

Binding.TargetUpdated事件触发,但不是Binding.SourceUpdated事件.

例如,以下工作

<EventTrigger RoutedEvent="Binding.TargetUpdated"> ...
Run Code Online (Sandbox Code Playgroud)

<EventTrigger RoutedEvent="Binding.SourceUpdated"> ...
Run Code Online (Sandbox Code Playgroud)

才不是.

如果我在代码或XAML中创建绑定,EventTriggerTriggers集合中使用或者使用它没有区别EventSetter.据我所知,事件只是没有解雇.

有谁知道怎么Binding.SourceUpdated着火?

c# data-binding wpf wpfdatagrid

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

修改CMAKE_SOURCE_DIR

是否有可能修改CMAKE_SOURCE_DIR为"欺骗"CMake认为顶级CMakeLists.txt文件在其他地方?

我有以下目录结构:

\src            <--- not a repository
    \cmake      <--- repository
    \common     <--- repository
    \project1   <--- repository
    ...
    CMakeLists.txt   <--- would like to locate this inside the cmake repository
Run Code Online (Sandbox Code Playgroud)

上述结构的问题在于顶级CMakeLists.txt位于任何存储库之外,因此无法检入更改.

是否可以在cmake目录中找到该文件(其中不包含任何其他内容),并且仍然运行CMake'就像'文件位于src目录中一样?

注意

  1. 我被客户端给了这个拆分存储库布局,没有必要告诉我它会导致问题.
  2. 将CMakeLists.txt文件复制到目录中或从src目录中复制当然可以正常工作,但我正在寻找一种解决方案,这种解决方案不会忘记将文件复制回源控制目录.
  3. 我已经玩过在脚本中修改CMAKE_SOURCE_DIR变量,但这实际上并没有改变工作目录.

cmake

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

当类的多重继承本身在其层次结构中具有菱形继承时,函数的继承不明确

文字描述下面的代码):我有一个提供类集合的库。对于每组类,我们有两个具体类型,( ClassA_Partial, ClassA), ( ClassB_Partial, ClassB) 等。其中每一个都分别实现 ( Interface_Partial, Interface) 。此外,Interface is a Interface_Partial和each Class? is a Class?_Partial - 创建一个菱形继承模式,其中顶部被虚拟继承。

为什么Interface_Partial函数在继承ClassAand时会产生二义性ClassB

struct Interface_Partial
{ 
    virtual ~Interface_Partial(); 
    virtual void f() = 0;
};

struct Interface
    :
    virtual Interface_Partial
{
    virtual void g() = 0;
};


struct ClassA_Partial : public virtual Interface_Partial
{
    void f() {};
};


struct ClassA : public Interface, public virtual ClassA_Partial …
Run Code Online (Sandbox Code Playgroud)

c++ inheritance multiple-inheritance virtual-inheritance msvc12

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

boost :: spirit :: qi Expectation Parser和parser对意外行为进行分组

我希望有人可以通过我在精神解析中使用>>>操作符的无知来发光.

我有一个工作语法,顶级规则看起来像

test = identifier >> operationRule >> repeat(1,3)[any_string] >> arrow >> any_string >> conditionRule;
Run Code Online (Sandbox Code Playgroud)

它依赖于属性来自动将解析后的值分配给融合自适应结构(即boost元组).

但是,我知道一旦我们匹配operationRule,我们必须继续或失败(即我们不希望允许回溯尝试以其他规则开头identifier).

test = identifier >> 
           operationRule > repeat(1,3)[any_string] > arrow > any_string > conditionRule;
Run Code Online (Sandbox Code Playgroud)

这会导致一个神秘的编译器错误('boost::Container' : use of class template requires template argument list).Futz一点点以下编译:

test = identifier >> 
           (operationRule > repeat(1,3)[any_string] > arrow > any_string > conditionRule);
Run Code Online (Sandbox Code Playgroud)

但属性设置不再有效 - 我的数据结构在解析后包含垃圾.这可以通过添加类似的操作来修复[at_c<0>(_val) = _1],但这似乎有点笨拙 - 以及根据boost文档使事情变慢.

所以,我的问题是

  1. 是否值得阻止反向追踪?
  2. 为什么我需要分组运算符 ()
  3. 我的上一个例子在operationRule匹配之后是否真的停止了回溯(我怀疑不是,似乎如果(...)允许整个解析器内部失败回溯)?
  4. 如果上一个问题的答案是/ …

c++ parsing boost boost-spirit boost-spirit-qi

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

使用临时对象调用构造函数

我不明白以下问题.

class InnerBox
{
public:
    InnerBox() : mContents(123) { };
private:
    int mContents;
};


class Box
{
public:

    Box(const InnerBox& innerBox) : mInnerBox(innerBox) { };

private:
    InnerBox mInnerBox;
};


void SomeFunction(const Box& box)
{
    return;
}

int main()
{
    Box box(InnerBox());  // !!PROBLEM!! Doesn't work: compiler thinks this is a function declaration
    SomeFunction(box);    // Error, cannot convert 'function pointer type' to const Box&

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

完整的错误消息是(Visual Studio 2010)

 error C2664: 'SomeFunction' : cannot convert parameter 1 from 'Box (__cdecl …
Run Code Online (Sandbox Code Playgroud)

c++ most-vexing-parse

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

为什么必须调用io_service :: reset()?

io_service::reset 文件指出,reset()必须后续调用之前被调用run(),run_one(),poll()poll_one().

问题:

  • 为什么这有必要? -
  • 如果忽略这一步,我会期待什么样的行为?
  • 为什么这个要求不够重要,无法保证assert它是否被忽略了?

一些上下文:我完成了一些单元测试的调试,这些单元测试在poll()没有重复调用的情况下进行了调试reset(),并试图检查每次执行的预期处理程序数量.似乎有足够的调用poll(),所有处理程序最终都按预期的顺序执行,但它需要的调用次数比您预期的要多.正确调用reset()修复了问题,但我很想知道这是否是不调用的唯一副作用reset(),或者是否存在可能更糟糕的影响,例如丢弃处理程序或可能出现在多线程示例中的效果.

boost-asio

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

Python 中的基本日志记录 dictConfig

注意我知道这个答案,但这对我不起作用,我希望有一个完整的、独立的工作示例。

我正在尝试logging.basicConfigdictConfigPython (2.7)替换

我的理解basicConfig只是设置根记录器:所以我试图对dictConfig. 也就是说,使用处理程序设置根记录器,然后我的应用程序中的所有记录器都将向上传播根记录器。

以下代码段缺少什么?行为是创建了日志文件,但没有输出。(我尝试了各种设置级别的组合,但似乎没有帮助)

import logging
log_dict = {
    'loggers': {
        'root': {
            'handlers': ['file_handler']
        }
    },
    'version': 1,
    'disable_existing_loggers': False,
    'handlers': {
        'file_handler': {
            'filename': 'c:/mylogfile.log',
            'class': 'logging.FileHandler'
        }
    }
}

logging.config.dictConfig(log_dict)
logging.info('THIS IS A TEST')
logging.shutdown()
exit()
Run Code Online (Sandbox Code Playgroud)

python logging

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

MSVC无法upcast unique_ptr

MSVC11上的以下代码失败并显示错误

cannot convert parameter 1 from 'std::unique_ptr<DerivedClass>' to 'std::unique_ptr<BaseClass>' 
Run Code Online (Sandbox Code Playgroud)

代码:

class BaseClass
{ };

class DerivedClass : public BaseClass
{ };

void MyFunction(std::unique_ptr<BaseClass> obj)
{ };

int main()
{
      auto ptr = std::unique_ptr<DerivedClass>(new DerivedClass);
      MyFunction(ptr);                 // fails, with error about cannot convert type
      // MyFunction(std::move(ptr));   // This will work
}
Run Code Online (Sandbox Code Playgroud)

正如在答案中所指出的那样,原因是std::move缺失了,但是错误信息让我很困惑地发布了问题,所以我已经更新了它,所以任何同样困惑的人都有最好的机会找到答案.

c++ c++11

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