拾遗:令人迷惑的写法

Posted 学习只为旅行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拾遗:令人迷惑的写法相关的知识,希望对你有一定的参考价值。


猜测:T是泛指类型,但是是类类型(之前是typename,现在直接限制死了:class)


猜测错误!这里的class和typename作用一摸一样!!!

#include <iostream>
#include <string>

using namespace std;

template < class T >
class Test
{
public:
    Test(T t) 
    { 
        cout << "t = " << t << endl;
    }
};

template < class T >
void func(T a[], int len)
{
    for(int i=0; i<len; i++)
    {
        cout << a[i] << endl;
    }
}


//
//

int a = 0;

class Test_1
{
public:
    static const int TS = 1;
};

class Test_2
{
public:
    struct TS
    {
        int value;
    };
};

template
< class T >
void test_class()
{
    typename T::TS * a;        // 1. 通过泛指类型 T 内部的数据类型 TS 定义指针变量 a (推荐的解读方式)
                               // 2. 使用泛指类型 T 内部的静态成员变量 TS 与全局变量 a 进行乘法操作
}


int main(int argc, char *argv[])
{
    // test_class<Test_1>();
    test_class<Test_2>();
    
    return 0;
}


如果这么写,编译时test_class<Test_2>();会报错,编译器更倾向于理解它为TS是个成员变量。加上typename就可以知道TS是个类型了





如果抛的是字符而不是约定好的int,下面虽然有catch(…)还是会报错!!!

#include <iostream>
#include <string>

using namespace std;

int func(int i, int j) throw(int, char)
{
    if( (0 < j) && (j < 10) )
    {
        return (i + j);
    }
    else
    {
        throw '0';
    }
}

void test(int i) try
{
    cout << "func(i, i) = " << func(i, i) << endl;
}
catch(int i)
{
    cout << "Exception: " << i << endl;
}
catch(...)
{
    cout << "Exception..." << endl;
}


int main(int argc, char *argv[])
{
    test(5);
    
    test(10);
    
    return 0;
}

小结

以上是关于拾遗:令人迷惑的写法的主要内容,如果未能解决你的问题,请参考以下文章

#yyds干货盘点#令人迷惑的equals 和 ==

拾遗理解Javascript中的Arguments

那些令人迷惑的名词:切图/H5/XML/REST

Python 拾遗

[C#.NET 拾遗补漏]02:数组的几个小知识

CMD批处理拾遗