相关疑难解决方法(0)

最奇怪的语言特征

在您看来,您遇到的最令人惊讶,奇怪,奇怪或真正的"WTF"语言功能是什么?

每个答案只能有一个功能.

language-agnostic programming-languages

975
推荐指数
176
解决办法
48万
查看次数

指向类数据成员"::*"的指针

我遇到了这个编译好的奇怪的代码片段:

class Car
{
    public:
    int speed;
};

int main()
{
    int Car::*pSpeed = &Car::speed;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么 C++有一个指向类的非静态数据成员的指针?在实际代码中这个奇怪的指针有什么用?

c++ pointers class c++-faq

223
推荐指数
8
解决办法
15万
查看次数

在编译时计算C字符串的长度.这真的是一个constexpr吗?

我正在尝试在编译时计算字符串文字的长度.为此,我使用以下代码:

#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++ standards string-literals constexpr c++11

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

你最喜欢的C++ Coding Style成语是什么?

你最喜欢的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++ coding-style

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

向非C++程序员解释C++ SFINAE

什么是C++中的SFINAE?

能不能用不熟悉C++的程序员理解的话来解释它?另外,像Python这样的语言中的SFINAE对应的概念是什么?

c++ programming-languages c++-faq sfinae

39
推荐指数
4
解决办法
4077
查看次数

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并选择第二次超载,因为替换TT[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)

虽然这个例子只是提供信息,但它显示了所有这些神秘段落的意图,并且似乎表明上面的代码应该起作用并拒绝第一次重载.

c++ arrays templates sfinae

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

SFINAE + sizeof =检测表达式是否编译

我刚刚发现了如何检查是否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_typervalue_of_type.

c++ metaprogramming sfinae

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

在编译时用C++检测函数

有没有办法,大概是使用模板,宏或两者的组合,我可以通常将一个函数应用于不同类的对象,但如果它们没有特定的功能,它们会以不同的方式响应吗?

我特别想要应用一个函数,如果对象具有该函数,将输出对象的大小(即集合中的对象数),但如果对象没有,则将输出一个简单的替换(例如"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)

我希望这可能类似于静态断言,尽管我显然想要编译不同的代码路径而不是在构建阶段失败.

c++ macros static templates

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

使用不完整类型(SFINAE)无效

我试图在模板化结构中使用一些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)

c++ templates sfinae template-specialization

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

奇怪的语法:范围运算符后的星号(::)?

帮助我理解以下代码片段:

(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

c++ function-pointers member-pointers

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

C++中的模板和预处理

如何编译此代码:

#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)

c++ enums templates if-statement c++03

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