2017-05-23 9 views
4

テンプレートクラスを作成しましたが、私はユーザー定義リテラルを使いたいと思っていました。ユーザー定義リテラルの代替テンプレート

マイコード:

template<int base = 10> 
class MyClass 
{ 
    // class code 
}; 

// template<int base> /* Not allowed */ 
MyClass<17> operator "" _G(const char* param, size_t length) 
{ 
    string temp(param, length); 
    return MyClass<17> (temp); 
} 

int main() 
{ 
    MyClass<17> A = "75AD"_G; 
    A.print(); 
} 

私の検索の結果として、私は、ユーザーのユーザー定義のリテラルは限られており、ほとんどのテンプレート上で、1つで使用することはできませんことを知っていました。

代替ソリューションがありますか、この場合、ユーザー定義のリテラルは不可能ですか?

注:baseは、2~30とすることができます。

+0

私は大文字小文字を混ぜる以外に( '_g'対' _G')、うまくいかない理由はありません。 –

+0

結果の型をリテラル自体に依存させたい場合は、C++ 11標準では使用できません。 gnuコンパイラを使用している場合、 'template auto operator" "_sl()'のようにリテラルを定義できるリテラルでその拡張を利用することができます。ベースをテンプレートパラメータに依存させるには、いくつかのsfinaeを使用する必要があります。 –

+0

"75AD" _G "がリテラルを見るだけでどんなタイプであるかを知ることはできません。あなたが使用しているコンテキスト(代入演算子など)は無関係です。式はそれ自身で定義された型でなければなりません。 –

答えて

9

実際には間接的に起こる可能性があります。テンプレートの控除をタイプ情報があるポイントまで遅らせることです。

struct MyClassCtor { 
    std::string param; 

    template<int base> 
    operator MyClass<base>() { 
    return param; 
    } 
}; 

MyClassCtor operator "" _G(const char* param, size_t length) 
{ 
    return {std::string(param, length)}; 
} 

これは"Return Type Resolver"イディオムの例です。

もちろん、auto a = 345_Gは、MyClass<>型の変数を作成しませんが、期待する関数に渡すことができます。それはあなたがそれをどのように見ているかに応じて、バグでもフィーチャーでもあります。

関連する問題