clang 3.4(svn) に Variable templates が部分的に実装されていたので試してみた

clang 3.4(svn) に C++1y で実装される予定の Variable templates が部分的に実装されていたので少し試してみました。
C++1y では以下のようにコードを記述することができるみたいです。

[ソース]

#include <iostream>
#include <limits>
#include <iomanip>
#include <array>

template<typename T>
constexpr T pi = T(3.1415926535897932385);


template<typename T>
T
area_of_circle_with_radius(T r){
    return pi<T> * r * r;
}


template<int... args>
constexpr std::array<int, sizeof...(args)> args{{args...}};


int
main(){
    std::cout.precision(std::numeric_limits<double>::digits10 + 1);
    std::cout << pi<float> << std::endl;
    std::cout << pi<double> << std::endl;
    std::cout << area_of_circle_with_radius(2.0f) << std::endl;
    std::cout << area_of_circle_with_radius(2.0) << std::endl;
    
    for(auto&& n : args<1, 2, 3, 4, 5>){
        std::cout << n << std::endl;
    }
    return 0;
}

[出力]

3.141592741012573
3.141592653589793
12.56637096405029
12.56637061435917
1
2
3
4
5


以前であればクラスや関数なんかを定義する必要があったんですが、c++1y では上記のような書き方ができるみたいですね。
まだそんなに触ってないんですが c++11 で追加された template aliases みたいにスッキリとしたコードが記述できそうな予感。

[コンパイラ]

  • clang++ (llvm) 3.4 20130814(trunk)