我刚问了一个关于访问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?
我一直很喜欢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++元素?令你震惊的是你跑到最近的编译器检查它是否真的如此?
我会接受第一个答案,即使在我测试之后我也不会相信.:)
我读过C++ Primer,它说功能模板专业化是一个高级主题,但我完全迷失了.任何人都可以提供一个例子,为什么功能模板专业化是重要和必要的?
为什么功能模板不支持类模板的部分专业化?底层逻辑是什么?
我有两个C函数,f1并f2采用相同的参数.根据条件,我需要使用相同的参数调用一个或另一个:
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语法?
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) 基本上,当使用减法溢出整数时,您获得的行为,但对于给定的位数.显而易见的方法,假设有符号整数:
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位以获得更多的理智.
在其中一个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语法吗?
下面简单的一段代码,用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) 简单的问题,如何在不使用定义的情况下缩短调用/名称.
例如,我有一个我必须在命名空间内调用的单例(我不能使用命名空间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显示在观察窗口(甚至将鼠标悬停在它上面,以便在调试中快速拉出对象),这是它无法做到的.
还有其他选择吗?你们做些什么来缩短名字?只需使用本地/成员指针来存储实例?
谢谢!