1. // TestCpp0x.cpp : Defines the entry point for the console application.  
  2. //  
  3. //test  
  4.  
  5. #include "stdafx.h"  
  6. #include <vector>  
  7. #include <string>  
  8. #include <functional>  
  9. #include <algorithm>  
  10. #include <iostream>  
  11.  
  12. using namespace std;  
  13.  
  14. ////////////////////////////////////////  
  15. // auto  
  16. void TestAuto()  
  17. {  
  18.     auto i = 3;  
  19.     auto d = 3.14;  
  20.     auto l = 1000L;  
  21.     auto f = 3.14f;  
  22.  
  23.     //auto nError; //Error: error C3531: 'nError': a symbol whose type contains 'auto' must have an initializer  
  24.     auto p = &i;  
  25.     auto pp = &p;  
  26.     auto q = *pp;  
  27.  
  28.     auto& iTemp = i;  
  29.     iTemp = 4;  
  30.  
  31.     auto pNewI = new int(3);  
  32.     auto pNewIntArry = new int[3];  
  33.  
  34.     delete pNewI;  
  35.     delete[] pNewIntArry;  
  36.  
  37.     const auto pi = 3.14;  
  38.     const auto const pi2 = &d;  
  39.     auto dd = 6.28;  
  40.     //pi2 = &dd;  
  41.     *pi2 = 6.28;  
  42.  
  43.     const doubleconst pi3 = &d;  
  44.     //pi3 = &dd;  
  45.     //*pi3 = 6.28;  
  46.  
  47.     volatile auto IsFinished = false;  
  48.  
  49.     //auto myArray[10];  
  50.  
  51.     vector<int> testVector;  
  52.     for(int i=0; i<=10; ++i)  
  53.         testVector.push_back(i);  
  54.  
  55.     auto vSize = testVector.size();  
  56.     for(decltype(vSize) j = 0; j<vSize; ++j)  
  57.     {  
  58.         printf("%d ", testVector[j]);  
  59.     }  
  60.  
  61.     // Or  
  62.     for(decltype(testVector.size()) j = 0; j<vSize; ++j)  
  63.     {  
  64.         printf("%d ", testVector[j]);  
  65.     }  
  66.  
  67.     printf("\n");  
  68.  
  69.     vector<string> strings;  
  70.     strings.push_back("AAA");  
  71.     strings.push_back("BBB");  
  72.     strings.push_back("CCC");  
  73.     for(vector<string>::const_iterator iter = strings.begin(); iter != strings.end(); ++iter)  
  74.     {  
  75.         printf("%s \n", (*iter).c_str());  
  76.     }  
  77.  
  78.     for(auto iter = strings.begin(); iter != strings.end(); ++iter)  
  79.     {  
  80.         printf("%s \n", (*iter).c_str());  
  81.     }  
  82.  
  83.     // To assign Lambdas to a variable  
  84.  
  85.     // To specify Trailing Return Types  
  86. }  
  87.  
  88. void TestDeclType()  
  89. {  
  90.     int i = 3;  
  91.     decltype(i) j = 4;  
  92.     decltype(1/0) t = 5;  
  93.     decltype(sizeof(3)) s = 6;  
  94. }  
  95.  
  96. void func(int* p)  
  97. {  
  98.     printf("func(int* p)\n");  
  99. }  
  100.  
  101. void func(int p)  
  102. {  
  103.     printf("func(int p)\n");  
  104. }  
  105.  
  106. void TestNullPtr()  
  107. {  
  108.     func(nullptr);  
  109.     func(NULL);  
  110. }  
  111.  
  112. void TestStaticAssert()  
  113. {  
  114.     //static_assert(1==2, "1 is not equal to 2"); //error C2338: 1 is not equal to 2  
  115.     static_assert(sizeof(void *) == 4, "This code should only be compiled as 32-bit.");  
  116.  
  117.     //_STATIC_ASSERT  
  118. }  
  119.  
  120. void TestLambda()  
  121. {  
  122.     auto lam1 = [](){};  
  123.  
  124.     auto squareLam = [](int n) { return n*n; };  
  125.     int result = squareLam(2);  
  126.     int result2 = squareLam(squareLam(2));  
  127.  
  128.     double pi = []{ return 3.14159; }();  
  129.  
  130.     int result3 = [](int n) { return n*n; }(3);  
  131.  
  132.     int nMax = [](int n1, int n2) {  
  133.         return (n1>n2) ? (n1) : (n2);  
  134.     } (56, 11);  
  135.  
  136.     int nMin = [](int n1, int n2) {  
  137.         return (n1<n2) ? (n1) : (n2);  
  138.     } (984, 658);  
  139.  
  140.     auto squareLam2 = [](int n) ->int { return n*n; };  
  141.  
  142.     int nAbs = [] (int n1) -> int //It's necessary  
  143.     {  
  144.         if(n1<0)  
  145.             return -n1;  
  146.         else 
  147.             return n1;  
  148.     }(-109);  
  149.  
  150.     /*  
  151.     [] - Capture nothing.   
  152.     [=] - Capture everything by value.   
  153.     [&] - Capture everything by reference.   
  154.     [var] - Capture var by value; nothing else, in either mode, is captured.   
  155.     [&var] - Capture var by reference; nothing else, in either mode, is captured.   
  156.     */  
  157.  
  158.     int a=10, b=20, c=30;  
  159.  
  160.     [a](voidmutable  // Capturing ONLY 'a' by value  
  161.     {  
  162.         // cannot modify  
  163.         a++;  // error C3491: 'a': a by-value capture   
  164.         //       cannot be modified in a non-mutable lambda  
  165.  
  166.         printf("a = %d", a);//11  
  167.     }();  
  168.  
  169.     printf("a = %d", a);//10  
  170.  
  171.     int nSum =0;  
  172.     [=, &nSum]  
  173.     {  
  174.         nSum = a+b+c;  
  175.     }();  
  176.  
  177.     tr1::function<bool (int)> IsEven = [](int n){ return n%2 == 0; } ;  
  178.     bool bEven = IsEven(41);  
  179.  
  180.     vector<int> myVector;  
  181.     for(int i=0; i<10; ++i)  
  182.         myVector.push_back(i);  
  183.  
  184.     printf("\n");  
  185.     for_each(myVector.begin(), myVector.end(), [](int n){ printf("%d ", n);});  
  186.  
  187.     int sum = 0;  
  188.     for_each(myVector.begin(), myVector.end(), [&sum](int n){ sum += n; } );  
  189. }  
  190.  
  191. auto GetPi() -> double 
  192. {  
  193.     return 3.14;  
  194. }  
  195.  
  196. void TestTrailingType()  
  197. {  
  198.     double pi = GetPi();  
  199. }  
  200.  
  201. //Begin  
  202. class MyMemoryBlock  
  203. {  
  204. public:  
  205.     MyMemoryBlock(int size = 10)  
  206.         :m_nSize(size)  
  207.     {  
  208.         m_pMemory = new unsigned char[size];  
  209.     }  
  210.  
  211.     ~MyMemoryBlock()  
  212.     {  
  213.         if(m_pMemory)  
  214.             delete[] m_pMemory;  
  215.     }  
  216.  
  217.     MyMemoryBlock(const MyMemoryBlock& another)  
  218.     {  
  219.         m_nSize = another.m_nSize;  
  220.         m_pMemory = new unsigned char[m_nSize];  
  221.         memcpy(m_pMemory, another.m_pMemory, m_nSize);  
  222.     }  
  223.  
  224.     /*  
  225.     MyMemoryBlock(MyMemoryBlock&& another)  
  226.     {  
  227.         m_nSize = another.m_nSize;  
  228.         m_pMemory = another.m_pMemory;  
  229.  
  230.         another.m_nSize = 0;  
  231.         another.m_pMemory = NULL;  
  232.     }  
  233.     */ 
  234.  
  235. private:  
  236.     unsigned char*  m_pMemory;  
  237.     int             m_nSize;  
  238. };  
  239.  
  240. MyMemoryBlock getMyMemoryBlock()  
  241. {  
  242.     MyMemoryBlock tempM;  
  243.     return tempM;  
  244. }  
  245.  
  246. void TestRValueReference()  
  247. {  
  248.     MyMemoryBlock m(getMyMemoryBlock());  
  249. }  
  250. //End  
  251.  
  252. // The compiler treats a named rvalue reference as an lvalue and an unnamed rvalue reference as an rvalue.  
  253. // Begin  
  254. // A class that contains a memory resource.  
  255. class MemoryBlock  
  256. {  
  257.     // TODO: Add resources for the class here.  
  258. };  
  259.  
  260. void g(const MemoryBlock&)   
  261. {  
  262.     cout << "In g(const MemoryBlock&)." << endl;  
  263. }  
  264.  
  265. void g(MemoryBlock&&)   
  266. {  
  267.     cout << "In g(MemoryBlock&&)." << endl;  
  268. }  
  269.  
  270. MemoryBlock&& f(MemoryBlock&& block)  
  271. {  
  272.     g(block);  
  273.     // return block; // It will report error when compiling  
  274.     //return static_cast<MemoryBlock&&>(block); // It works  
  275.     return std::move(block);  
  276. }  
  277.  
  278. MemoryBlock ff()  
  279. {  
  280.     MemoryBlock mb;  
  281.     return mb;  
  282. }  
  283.  
  284. int gg(const MemoryBlock& block)  
  285. {  
  286.     return 1;  
  287. }  
  288.  
  289. void TestRValueReference2()  
  290. {  
  291.     g(f(MemoryBlock()));  
  292.  
  293.     int i = gg(ff());  
  294. }  
  295.  
  296. // End  
  297.  
  298. void TestDoubleBracket()  
  299. {  
  300.     vector<vector<int>> myVector;  
  301. }  
  302.  
  303. template<class T>  
  304. struct vector_tth  
  305. {  
  306.     typedef std::vector<T, allocator<T>> R;  
  307. };  
  308.  
  309. // Not implemented in VC10  
  310. //template<class T>  
  311. //using vectorWithAllocator = std::vector<T>;  
  312.  
  313. void TestTemplateUsing()  
  314. {  
  315.     vector_tth<int>::R myIntVector;  
  316. }  
  317.  
  318. enum Priority : unsigned char // unsigned char  
  319. {  
  320.     VeryLow = 0,  
  321.     Low,  
  322.     Medium,  
  323.     High,  
  324.     VeryHigh  
  325. };  
  326.  
  327. void TestStrongTypeEnum()  
  328. {  
  329.     Priority priorirty = VeryHigh;  
  330. }  
  331.  
  332. struct A {  
  333.     int _0;  
  334. };  
  335.  
  336. A f()  
  337. {  
  338.     A a;  
  339.     return a;  
  340. }  
  341.  
  342. typedef A (*FuncDef)();  
  343.  
  344. A g(FuncDef funcDef)  
  345. {  
  346.     return funcDef();  
  347. }  
  348.  
  349. int _tmain(int argc, _TCHAR* argv[])  
  350. {  
  351.  
  352.  
  353.     //A a0(A());  
  354.  
  355.     //decltype(&a0) b = NULL;  
  356.  
  357.     //int i=3;  
  358.  
  359.     //A (*a0_p0)();  
  360.  
  361.     //a0_p0 = f;  
  362.  
  363.     //a0 a;       
  364.     //a = g;  
  365.  
  366.     //a(a0_p0); // CANNOT LINK!!!  
  367.  
  368.  
  369.  
  370.     //A a1(A::A());  
  371.  
  372.     //a1._0;  
  373.  
  374.     int a =0;  
  375.     scanf("%d", &a);  
  376.  
  377.     TestAuto();  
  378.     //TestDeclType();  
  379.     //TestNullPtr();  
  380.     //TestStaticAssert();  
  381.     //TestLambda();  
  382.     /*TestTrailingType();  
  383.     TestRValueReference();  
  384.     TestRValueReference2();*/ 
  385.     return 0;  
  386. }