

N3797([pdf](http://www.open-
std.org/jtc1/sc22/wg21/docs/papers/2013/n3797.pdf)) の P.309 にある  

>
[code]

>     template <char...> double operator "" _\u03C0();
>  
[/code]

これの意味がわかりません。  
引数が空って、2_π の 2 が無視されるんですか？  
それとも _π で使うなら constexpr との違いは？  
なぜパラメータパックなんですか？


CC BY-SA 3.0
2015-03-17T06:01:45.480
8006
2015-03-17T15:11:04.237
2015-03-17T15:11:04.237
3639
8873
question
c++ c++11
operator "" _π について


無視されるわけではなく、_π以前の部分の文字列がcharのパラメーターパックとして渡されます。

例えば、`14142_π`は、`operator "" _π<'1', '4', '1', '4', '2'>()`の呼び出しと同じです。  
以下のサンプルでは、パラメーターパックから整数値を復元しています。

[code]

    #include <iostream>
    #include <cmath>
    
    template<typename T>
    double decimal(T value) {
        return value - '0';
    }
    
    template<typename T, typename... Targs>
    double decimal(T value, Targs... Fargs) {
        return (value - '0') * pow(10, sizeof...(Fargs)) + decimal(Fargs...);
    }
    
    template <char... T> double operator "" _π() {
        return decimal(T...);
    }
    
    int main() {
        std::cout << 14142_π;
    }
    
[/code]

<http://melpon.org/wandbox/permlink/Z0SiejoGSos13ooN>


CC BY-SA 3.0
2015-03-17T09:19:27.327
8017
2015-03-17T09:31:21.867
2015-03-17T09:31:21.867
3639
3639
8006
answer


@h2so5
さんの回答通り、`2`の部分は1文字(`char`型)づつテンプレートのパラメータパックに渡されます。このとき、引数部分は空でなければなりません。(§13.5.8/paragraph
5)

> 5 The declaration of a literal operator template shall have an empty
> _parameter-declaration-clause_ and its _template-parameter-list_ shall have
> a single template-parameter that is a non-type template parameter pack
> (14.5.3) with element type `char`.

* * *

> それとも _π で使うなら constexpr との違いは？  
>  なぜパラメータパックなんですか？

このコード片は「User-defined literals の識別子(identifier)に、UCN(universal-character-
name)が使える」ことを示すことが目的なので、それ以上の意味論を追求しても仕方ない気がします。


CC BY-SA 3.0
2015-03-17T12:37:46.333
8026
2015-03-17T12:37:46.333
49
8006
answer