相关疑难解决方法(0)

我无法理解这一行 - 解除引用私有成员变量的地址或者什么?

我刚问了一个关于访问STL适配器的底层容器的问题.我得到了一个非常有用的答案:

template <class T, class S, class C>
    S& Container(priority_queue<T, S, C>& q) {
        struct HackedQueue : private priority_queue<T, S, C> {
            static S& Container(priority_queue<T, S, C>& q) {
                return q.*&HackedQueue::c;
            }
        };
    return HackedQueue::Container(q);
}

int main()
{
    priority_queue<SomeClass> pq;
    vector<SomeClass> &tasks = Container(pq);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,我无法理解这一行:

return q.*&HackedQueue::c;
Run Code Online (Sandbox Code Playgroud)

这条线做什么?此外,该行怎么可以访问私有容器priority_queue传递给函数Container

c++ stl

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

是否有一个C++相当于Python的"导入bigname为b"?

我一直很喜欢Python的

import big_honkin_name as bhn
Run Code Online (Sandbox Code Playgroud)

所以你可以使用bhn.thing而不是big_honkin_name.thing在源代码中使用相当多的详细信息.

我在C++代码中看到过两种类型的命名空间:

using namespace big_honkin_name; // includes fn().
int a = fn (27);
Run Code Online (Sandbox Code Playgroud)

(我敢保证是一个坏的事情)或:

int a = big_honkin_name::fn (27);
Run Code Online (Sandbox Code Playgroud)

有没有办法在C++代码中获得Python功能,如:

alias namespace big_honkin_name as bhn;
int a = bhn::fn (27);
Run Code Online (Sandbox Code Playgroud)

c++ python alias namespaces

6
推荐指数
3
解决办法
610
查看次数

C++标准中最令人惊讶的元素是什么?

我决定更熟悉我最喜欢的编程语言,但阅读标准很无聊.

什么是最令人惊讶,反直觉,或只是简单的C++元素?令你震惊的是你跑到最近的编译器检查它是否真的如此?

我会接受第一个答案,即使我测试之后我也不会相信.:)

c++

6
推荐指数
4
解决办法
678
查看次数

功能模板专业化的重要性和必要性

我读过C++ Primer,它说功能模板专业化是一个高级主题,但我完全迷失了.任何人都可以提供一个例子,为什么功能模板专业化是重要和必要的?

为什么功能模板不支持类模板的部分专业化?底层逻辑是什么?

c++ template-specialization

6
推荐指数
2
解决办法
4050
查看次数

使用三元运算符选择C函数

我有两个C函数,f1f2采用相同的参数.根据条件,我需要使用相同的参数调用一个或另一个:

if (condition) {
    result = f1(a, b, c);
} else {
    result = f2(a, b, c);
}
Run Code Online (Sandbox Code Playgroud)

我理解可以使用以下语法:

result = condition ? f1(a, b, c) : f2(a, b, c)
Run Code Online (Sandbox Code Playgroud)

是否有可能需要一次写入参数的DRY语法?

c syntax function call function-call

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

Dynamic memory and constructor exceptions

Early today I discovered function try-catch blocks (from here in fact) and then went on a bit of a research spree - apparently they're main use is it catch exceptions throw in by a constructor initialiser list.

无论如何,这让我想到了失败的构造函数,我已经到了一个我需要一点澄清的阶段.这只是我试图了解更多关于语言的内容,所以我没有一个实际的例子,但是这里......


鉴于此示例代码:

class A
{
private:
    B b
    C *c;    //classes B, C & D omitted for brevity as not really relevant
    D d;
public
    A(int x, int y, int z)
};

A::A(int x, int y, int z)
try
    : b( …
Run Code Online (Sandbox Code Playgroud)

c++ constructor exception

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

整数减法,包含N位

基本上,当使用减法溢出整数时,您获得的行为,但对于给定的位数.显而易见的方法,假设有符号整数:

template <int BITS>
int sub_wrap(int v, int s) {
  int max = (1<<(BITS));
  v -= s;
  if (v < -max) v += max*2;
  // or if branching is bad, something like:
  // v += (max*2) * (v < -max)
  return v;
}

// For example subtracting 24 from -16 with 5 bit wrap,
// with a range of -32, 31
sub_wrap<5>(-16, 28); -> 20
Run Code Online (Sandbox Code Playgroud)

有没有一种巧妙的做法,不那么丑陋,最好比上面的更快?

更新:对于混乱感到抱歉.我不假思索地包括使用除了叹息位之外的位数的令人困惑的表示法.所以在上面,用6位替换5位以获得更多的理智.

c++ math bit-manipulation subtraction

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

循环初始化语句中的未命名结构声明

在其中一个SO线程中,我曾看到使用未命名的structfor for for for循环中不同类型的多个变量的占位符:

例如:

for(struct {
      int i;
      double d;
      char c;
    } obj = { 1, 2.2, 'c' };
    obj.i < 10;
    ++obj.i)
{
  ...
}
Run Code Online (Sandbox Code Playgroud)

这与g ++ 编译很好.
这是标准的C++ 03语法吗?

c++ struct for-loop anonymous-class

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

这是标准的C++代码吗?

下面简单的一段代码,用VC2008编译但g ++拒绝代码:

#include <iostream>

class myclass
{
protected:
    void print() { std::cout << "myclass::print();"; }
};

struct access : private myclass
{
    static void access_print(myclass& object)
    {
        // g++ and Comeau reject this line but not VC++
        void (myclass::*function) () = &myclass::print;

        (object.*function)();
    }
};

int main()
{
    myclass object;
    access::access_print(object);
}
Run Code Online (Sandbox Code Playgroud)

(/W4) 在VC中打开,但它没有给出任何警告.

g ++ 4.4.1给出了一个错误:

correct.cpp: In static member function ‘static void access::access_print(myclass&)’:
correct.cpp:6: error: ‘void myclass::print()’ is protected
Run Code Online (Sandbox Code Playgroud)

如果g ++是正确的,我如何访问类的受保护成员?有另一种方式吗?


@Suroot你是说我不应该传递类型的对象myclass?实际上并不重要,g ++给出了相同的错误,但VC编译代码时没有任何警告.

#include <iostream>

class …
Run Code Online (Sandbox Code Playgroud)

c++ standards standards-compliance

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

不使用定义的较短的呼叫/名称

简单的问题,如何在不使用定义的情况下缩短调用/名称.

例如,我有一个我必须在命名空间内调用的单例(我不能使用命名空间blabla,因为它是不允许的),如下所示:

MyFW::GameRoot::Instance()->DoSomething();
Run Code Online (Sandbox Code Playgroud)

现在我可以将它分配给一个变量,如果我在同一个类/函数中多次使用它,它会有所作为,但在许多类/函数中使用它会变得很麻烦.我决定使用#define:

#define MyFW::GameRoot::Instance() ROOT //defined in GameRoot.h

ROOT->DoSomething(); //Used where-ever GameRoot.h is included
Run Code Online (Sandbox Code Playgroud)

更好,我真的很喜欢它,特别是因为现在无论我在哪里看到ROOT(通过V-Assist进行颜色编码)我都知道它是什么...除非我在那里有一个断点,我需要Visual Studio解决ROOT显示在观察窗口(甚至将鼠标悬停在它上面,以便在调试中快速拉出对象),这是它无法做到的.

还有其他选择吗?你们做些什么来缩短名字?只需使用本地/成员指针来存储实例?

谢谢!

c++ visual-studio-2008

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