C++と色々

主にC++やプログラムに関する記事を投稿します。

VS2012

VS2012を導入したので(あと2012.11版のVC++)、VS2012で追加された新しいC++11の機能を試してみた。機能を試すことが目的なのでソースの意味や綺麗さは皆無です…

#include <vector>
#include <iostream>

//新しいSTL
#include <atomic>
#include <chrono>
#include <condition_variable>
#include <filesystem>
#include <future>
#include <initializer_list>
#include <mutex>
#include <ratio>
#include <thread>

//外部テンプレート
extern template class std::vector<double>;

class intenger
{
public:
    intenger(int i) : value(i)
    {
    }

    //コンストラクタの委譲
    intenger() : intenger(0)
    {
    }

    //強い型付けenum&前方宣言
    enum class int_size : unsigned int;

    //final指定(ここにはないけどoverride指定もある)
    virtual int get() const final
    {
        return value;
    }

    //明示的な型変換
    explicit operator double() const
    {
        return static_cast<double>(value);
    }

    //強い型付けenum
    enum class int_size : unsigned int
    {
        MAX = 2^32U,
        MIN = 0U,
    };

private:
    int value;
};

//テンプレート関数のデフォルトテンプレート引数
template<class T, class U = double>
void f(T, U* = nullptr)
{
}

//可変長テンプレート引数
template<class... T>
void g(T... t)
{
}

//初期化リスト
void h(std::initializer_list<int> list)
{
    //範囲for文
    for(auto i : list)
    {
        std::cout << i << std::endl;
    }
}

struct point
{
public:
    point(){}
    point(int x, int y) : x_(x), y_(y) {}

private:
    int x_;
    int y_;
};

//別名テンプレート、コンパイラ自動生成関数のdefault/delete指定はない

int main()
{
    //デフォルトテンプレート引数
    f(4);
    
    //可変長テンプレート引数
    g<int, float, double, const char*, char>(1, 1.0f, 1.0, "a", 'a');

    //統一的な初期化構文(Uniform Initialization)
    point p{10, 20};

    //初期化リスト
    h({1, 3, 4});
 
    return 0;
}