标签: c++

C++:隐藏规则背后的基本原理

C++中隐藏规则背后的基本原理是什么?

class A { void f(int); }
class B : public A { void f(double); } // B::f(int) is hidden
Run Code Online (Sandbox Code Playgroud)
  • 如果它是一个有意义的功能,我认为也应该可以隐藏功能而无需定义具有相同名称的新功能:如下所示:

    class B : public A { hide void f(double); }
    
    Run Code Online (Sandbox Code Playgroud)

    但这是不可能的.

  • 我不认为它简化了编译器的工作,因为编译器必须能够在显式使用指令时取消隐藏函数using:

    class B : public A { using A::f; void f(double); } // B::f(int) NOT hidden
    
    Run Code Online (Sandbox Code Playgroud)

那么,怎么会有隐藏规则呢?


嗯,所有三个答案似乎都很好,并且显示了隐藏规则的不同理由.我不确定我应该接受哪个答案.

c++ language-design hide rationale

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

如何使用boost将日期时间格式化为字符串?

我想使用boost将日期/时间格式化为字符串.

从当前日期/时间开始:

ptime now = second_clock::universal_time();
Run Code Online (Sandbox Code Playgroud)

并以包含此格式的日期/时间的wstring结束:

%Y%m%d_%H%M%S
Run Code Online (Sandbox Code Playgroud)

你能告诉我实现这个的代码吗?谢谢.

c++ formatting datetime

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

使用cv :: Mat类型时如何在图像上叠加文本

我正在使用opencv 2.1.在我的代码中,我有几个图像存储为Mat对象初始化如下:

Mat img1 = imread("img/stuff.pgm", CV_LOAD_IMAGE_GRAYSCALE);
Run Code Online (Sandbox Code Playgroud)

在矩阵运算完成后,我可以使用imshow()正确显示它们.现在我想在图像上添加一些文字来描述发生了什么.看看文档似乎就是cvPutText()我需要的功能.但是,当我尝试这样的事情时:

cvPutText(result, "Differencing the two images.", cvPoint(30,30), &font, GREEN);

我得到以下编译错误: error: cannot convert ‘cv::Mat’ to ‘CvArr*’ for argument ‘1’ to ‘void cvPutText(CvArr*, const char*, CvPoint, const CvFont*, CvScalar)’

在显示此图像时,我需要做些什么才能添加一些文字?

c++ opencv computer-vision

25
推荐指数
3
解决办法
8万
查看次数

实现"变体"类

注意:我知道boost::variant,但我对设计原则感到好奇.这个问题主要是为了自我教育.

原帖

在我目前的工作中,我找到了一个旧的变体类实现.它是用a实现的union,只能支持少数几种数据类型.我一直在考虑如何设计改进版本.经过一些修修补补后,我得到了似乎有用的东西.但是我想知道你对它的看法.这里是:

#include <iostream>
#include <map>
#include <stdexcept>
#include <string>
#include <typeinfo>
#include <boost/shared_ptr.hpp>

class Variant
{
public:
    Variant() { }

    template<class T>
    Variant(T inValue) :
        mImpl(new VariantImpl<T>(inValue)),
        mClassName(typeid(T).name())
    {
    }

    template<class T>
    T getValue() const
    {
        if (typeid(T).name() != mClassName)
        {
            throw std::logic_error("Non-matching types!");
        }

        return dynamic_cast<VariantImpl<T>*>(mImpl.get())->getValue();
    }

    template<class T>
    void setValue(T inValue)
    {
        mImpl.reset(new VariantImpl<T>(inValue));
        mClassName = typeid(T).name();
    }

private:
    struct AbstractVariantImpl
    {
        virtual ~AbstractVariantImpl() {}
    };

    template<class T>
    struct VariantImpl : …
Run Code Online (Sandbox Code Playgroud)

c++

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

std :: map :: iterator是否返回值或值本身的副本?

我正在尝试在地图中创建地图:

typedef map<float,mytype> inner_map;
typedef map<float,inner_map> outer_map;
Run Code Online (Sandbox Code Playgroud)

我能在内部地图中放置一些东西,或者iterator :: second会返回一个副本吗?

stl_pair.h建议后者:

74: _T2 second;          ///< @c second is a copy of the second object
Run Code Online (Sandbox Code Playgroud)

但我的测试程序运行正常,代码如下:

it = my_map.lower_bound(3.1415);
(*it).second.insert(inner_map::value_type(2.71828,"Hello world!");
Run Code Online (Sandbox Code Playgroud)

那真相在哪里?这是副本吗?

c++ iterator stdmap

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

C++:什么更快 - 在hashmap或switch语句中查找?

我有一个代码模式,可以将一个整数转换为另一个整数.像这样:

int t(int value) {
    switch (value) {
        case 1: return const_1;
        case 3: return const_2;
        case 4: return const_3;
        case 8: return const_4;
        default: return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

目前它有大约50个条目,可能稍后会有更多,但可能不超过一百或两个.所有值都是预定义的,当然我可以按其值排序案例标签.所以问题是,什么会更快 - 这种方法或将其放入哈希映射(我无法访问std :: map,所以我说的是我的SDK中可用的自定义哈希映射)并在该表中执行查找?也许这有点过早优化,但是......但我只是需要你的意见.

提前致谢.

编辑:我的案例值将在0到0xffff的范围内.并且关于哈希映射的更好的可读性.我不知道是否真的会有更好的可读性,因为我还需要值来填充它,所以常量映射的是板材还是需要在我的代码的某个地方.

编辑2:已经给出了许多有用的答案,非常感谢.我想在这里添加一些信息.我的哈希键是整数,我的整数哈希函数基本上只是一个带有积分溢出的乘法:

EXPORT_C __NAKED__ unsigned int DefaultHash::Integer(const int& /*aInt*/)
{
_asm mov edx, [esp+4]
_asm mov eax, 9E3779B9h
_asm mul dword ptr [edx]
_asm ret
}
Run Code Online (Sandbox Code Playgroud)

所以应该很快.

c++ performance hashmap switch-statement

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

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

我可以选择性地(强制)内联函数吗?

清洁代码(以及我遇到过的其他几本书)中,建议保持功能较小并在它们变大时将其分解.它还表明功能应该只做一件事而且只做一件事.

C++中优化软件时, Agner Fog声称他不喜欢分解函数的规则只是因为它超过了许多行的某个阈值.他声称这会导致不必要的跳跃,从而降低性能.

首先,我理解,如果我正在处理的代码不是紧密循环并且函数很重,那么调用它们所花费的时间与函数中的代码所用的时间相比是相形见绌的.执行.但是我们假设我正在处理大多数时候由其他对象/函数使用的函数,并且执行相对简单的任务.这些函数遵循第一段中列出的建议(即,执行单个函数并且很小/可理解).然后我开始编写一个性能关键函数,它在紧密循环中利用这些其他函数,本质上是一个框架函数.最后,假设内嵌它们对性能关键功能有好处,但对任何其他功能都没有任何好处(是的,我已经对此进行了描述,尽管有很多我想避免的复制和粘贴).

马上就可以说标记函数inline并让编译器选择.但是如果我不希望所有这些函数都在` .inl文件中或暴露在标题中呢?在我目前的情况下,性能关键函数和它使用的其他函数都在同一个源文件中.

总而言之,我可以有选择地(强制)内联单个函数的函数,以便结束代码表现得像是一个大函数,而不是几个对其他函数的调用.

c++ optimization coding-style inline

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

如何在std :: map中使用struct作为键?

我有以下代码,但我在最后一行收到错误:

struct coord { 
    int x, y; 

    bool operator=(const coord &o) {
        return x == o.x && y == o.y;
    }

    bool operator<(const coord &o) {
        return x < o.x || (x == o.x && y < o.y);
    }
};

map<coord, int> m;
pair<coord, int> p((coord{0,0}),123);
m.insert(p); // ERROR here
Run Code Online (Sandbox Code Playgroud)

如何在地图中使用结构作为键?


我试图将代码更改为:

struct coord { 
    int x, y; 

    bool const operator==(const coord &o) {
        return x == o.x && y == o.y;
    }

    bool const operator<(const coord &o) {
        return …
Run Code Online (Sandbox Code Playgroud)

c++ stdmap c++11

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

如何将文件嵌入可执行文件?

我有一个用C++编写的小型演示可执行文件,它只依赖于在运行之前加载的一个5kb PNG图像,用于我制作的像素文本.由于这个文件,我需要提供一个ZIP存档而不是只有一个可执行文件,这会在下载和"播放"之间产生足够的摩擦,我相信这会阻止一些人尝试它.

我的问题是,无论如何将PNG文件(以及任何其他文件)真正嵌入到可执行文件或源代码中,以便它是一个文件,并且可执行文件可以使用它吗?

我能够将PNG解析为字节流,因此不需要将其转换为像素数据.

提前致谢!(存在与此类似标题的其他问题,但他们和他们的答案似乎涉及更具体的问题,并且不是很有帮助)

编辑:编译器是Visual C++ 2010,这是在Windows上(虽然我想避免Windows特定的实用程序)

edit2:Alf的答案看起来像是最便携的方法,所以我很快写了一个函数来将PNG文件解析成TXT或头文件,可以读作unsigned char数组.它在这种形式下似乎与PNG文件本身相同,但我的png加载器不接受该数组.从内存加载时,PNG解析器会接受(void * buffer, size_t length)它是否重要.

代码,如果你想看,但如果你认为它们比这个方法更好,我仍会接受其他答案:

void compileImagePNGtoBinary(char * filename, char * output){

    FILE * file = fopen(filename, "rb");
    FILE * out = fopen(output, "w");

    unsigned char buffer[32];
    size_t count;
    fprintf(out, "#pragma once \n\n static unsigned char TEXT_PNG_BYTES[] = { ");
    while(!feof(file)){
            count = fread(buffer, 1, 32, file);

            for(int n = 0; n < count; ++n){
                    fprintf(out, "0x%02X, ", buffer[n]);
            };
    };
    fprintf(out, "};"); …
Run Code Online (Sandbox Code Playgroud)

c++ executable file

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