在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?
每个答案只能有一个功能.
我遇到了这个编译好的奇怪的代码片段:
class Car
{
public:
int speed;
};
int main()
{
int Car::*pSpeed = &Car::speed;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么 C++有一个指向类的非静态数据成员的指针?在实际代码中这个奇怪的指针有什么用?
我正在尝试在编译时计算字符串文字的长度.为此,我使用以下代码:
#include <cstdio>
int constexpr length(const char* str)
{
return *str ? 1 + length(str + 1) : 0;
}
int main()
{
printf("%d %d", length("abcd"), length("abcdefgh"));
}
Run Code Online (Sandbox Code Playgroud)
一切都按预期工作,程序打印4和8.由clang生成的汇编代码显示结果在编译时计算:
0x100000f5e: leaq 0x35(%rip), %rdi ; "%d %d"
0x100000f65: movl $0x4, %esi
0x100000f6a: movl $0x8, %edx
0x100000f6f: xorl %eax, %eax
0x100000f71: callq 0x100000f7a ; symbol stub for: printf
Run Code Online (Sandbox Code Playgroud)
我的问题:标准是否保证length函数将在编译时进行评估?
如果这是真的,编译时字符串文字计算的大门刚刚为我打开...例如,我可以在编译时计算哈希值等等......
你最喜欢的C++编码风格是什么?我问的是样式或编码排版,例如你在哪里放大括号,在关键字后面有空格,缩进的大小等等.这与最佳实践或要求相反,例如总是删除数组delete[].
以下是我最喜欢的一个示例:在C++类初始值设定项中,我们将分隔符放在行的前面而不是后面.这样可以更容易地保持最新状态.这也意味着版本之间的源代码控制差异更清晰.
TextFileProcessor::
TextFileProcessor( class ConstStringFinder& theConstStringFinder )
: TextFileProcessor_Base( theConstStringFinder )
, m_ThreadHandle ( NULL )
, m_startNLSearch ( 0 )
, m_endNLSearch ( 0 )
, m_LineEndGetIdx ( 0 )
, m_LineEndPutIdx ( 0 )
, m_LineEnds ( new const void*[ sc_LineEndSize ] )
{
;
}
Run Code Online (Sandbox Code Playgroud) 什么是C++中的SFINAE?
能不能用不熟悉C++的程序员理解的话来解释它?另外,像Python这样的语言中的SFINAE对应的概念是什么?
请考虑以下代码:
template<typename T>
char (&f(T[1]))[1];
template<typename T>
char (&f(...))[2];
int main() { char c[sizeof(f<void()>(0)) == 2]; }
Run Code Online (Sandbox Code Playgroud)
我期待它做SFINAE并选择第二次超载,因为替换T为T[1]收益率
void [1]()
Run Code Online (Sandbox Code Playgroud)
当然,这是一种无效的类型.在将模板参数替换为函数参数并检查有效的结果类型(如14.8.2 [temp.deduct]描述)之后,完成参数类型(数组 - >指针)的调整.
但是考勤和海湾合作委员会都未能编制上述内容.两者都有不同的诊断.
Comeau说:
"ComeauTest.c",第2行:错误:不允许使用函数数组
char (&f(T[1]))[1];
GCC说(版本4.3.3):
错误:ISO C++禁止零大小的数组
c
意思是,海湾合作委员会不会无法替代,但它选择了第一次超载f,返回sizeof1,而不是像Comeau那样无法替代它.
什么编译器是正确的,我的代码是否有效?请参阅或引用答案中适当的标准部分.谢谢!
更新:标准本身在列表中包含这样的示例14.8.2/2.我不知道为什么我先忽略它:
template <class T> int f(T[5]);
int I = f<int>(0);
int j = f<void>(0); // invalid array
Run Code Online (Sandbox Code Playgroud)
虽然这个例子只是提供信息,但它显示了所有这些神秘段落的意图,并且似乎表明上面的代码应该起作用并拒绝第一次重载.
我刚刚发现了如何检查是否operator<<提供了类型.
template<class T> T& lvalue_of_type();
template<class T> T rvalue_of_type();
template<class T>
struct is_printable
{
template<class U> static char test(char(*)[sizeof(
lvalue_of_type<std::ostream>() << rvalue_of_type<U>()
)]);
template<class U> static long test(...);
enum { value = 1 == sizeof test<T>(0) };
typedef boost::integral_constant<bool, value> type;
};
Run Code Online (Sandbox Code Playgroud)
这个技巧是众所周知的,还是我刚刚获得了诺贝尔奖的元编程?;)
编辑:我使代码更容易理解,更容易适应两个全局函数模板声明lvalue_of_type和rvalue_of_type.
有没有办法,大概是使用模板,宏或两者的组合,我可以通常将一个函数应用于不同类的对象,但如果它们没有特定的功能,它们会以不同的方式响应吗?
我特别想要应用一个函数,如果对象具有该函数,将输出对象的大小(即集合中的对象数),但如果对象没有,则将输出一个简单的替换(例如"N/A") "T.即
NO_OF_ELEMENTS( mySTLMap ) -----> [ calls mySTLMap.size() to give ] ------> 10
NO_OF_ELEMENTS( myNoSizeObj ) --> [ applies compile time logic to give ] -> "N/A"
Run Code Online (Sandbox Code Playgroud)
我希望这可能类似于静态断言,尽管我显然想要编译不同的代码路径而不是在构建阶段失败.
我试图在模板化结构中使用一些SFINAE.我将我的问题减少到以下,并可以使这项工作:
template<bool mybool>
struct test {
void myfunc();
};
template<bool mybool>
void test<mybool>::myfunc() {
std::cout << "test true" << std::endl;
}
template<>
void test<false>::myfunc() {
std::cout << "test false" << std::endl;
}
int main(int argc, char ** argv) {
test<true> foo;
test<false> bar;
foo.myfunc();
bar.myfunc();
}
Run Code Online (Sandbox Code Playgroud)
使用此代码,我得到结果:
test true
test false
Run Code Online (Sandbox Code Playgroud)
但是,如果我想考虑我struct test的多个模板参数,我尝试调整上面这样:
template<int myint, bool mybool>
struct test {
void myfunc();
};
template<int myint, bool mybool>
void test<myint,mybool>::myfunc() {
std::cout << "test true" << std::endl;
}
template<int …Run Code Online (Sandbox Code Playgroud) 帮助我理解以下代码片段:
(foo.h中)
class Foo
{
public:
typedef void (MyType::*Handler)(SomeOtherType* t);
Foo(Handler handler) : handler_(handler) { }
private:
Handler handler_;
};
Run Code Online (Sandbox Code Playgroud)
(mytype.h)
class MyType
{
public:
MyType() { }
void fun1() { }
void fun2() { }
};
Run Code Online (Sandbox Code Playgroud)
foo.h中的typedef究竟是什么声明?我可以看到它是某种函数指针,但星号的意义是什么?它似乎是取消引用一个类型(??)并以某种方式试图将新typedef指针"附加"到MyType类型(?!?).
有人可以在这里说清楚吗?真的很困惑:S
如何编译此代码:
#include <iostream>
using namespace std;
enum E { A, B};
template< E x>
class C {
public:
#if( x == A)
static void foo() {
cout << "A";
}
#elif( x == B)
static void goo() {
cout << "B";
}
#endif
};
int main() {
C< A>::foo();
C< B>::goo();
return 0;
}
error: ‘goo’ is not a member of ‘C<(E)1u>’
Run Code Online (Sandbox Code Playgroud)
我有两个大的类只有几行不同,所以我想制作枚举模板.问题是这些行中有using关键字,所以我不知道该放什么.
有没有正确的方法呢?
PS>我必须使用C++ 03.
编辑:一点澄清.我知道template<>构造,但我不想使用它,因为这样我得到了很多代码重复.也许我可以以某种方式进行部分"模板实例化"(如果这是正确的术语template<>)?
假设我有两个类(我不会有更多):
class A {
public:
//…a …Run Code Online (Sandbox Code Playgroud)