2017-07-13 12 views
2

私はC++ 0Xを使用します。 私はテンプレートの戻り値の型を持つテンプレート関数を持っている:C++は、暗黙的に呼び出されるテンプレート関数の戻り型を推定します。

MyBuffer<10> buf = "1234567890"; 

template< class T > 
T getVal(); 

template<> 
MyBuffer<5> getVal<MyBuffer<5>>() 
{ 
    return MyBuffer<5>(buf.data()); 
} 

template<> 
MyBuffer<10> getVal<MyBuffer<10>>() 
{ 
    return buf; 
} 

だから、第二に5つのシンボルを返す一つのケースで - 10 私は、次の方法でそれを使用することができます。

MyBuffer<5> fiveChars = getVal<MyBuffer<5>>(); 
MyBuffer<10> tenChars = getVal<MyBuffer<10>>(); 

しかし、私は思っていた:もちろん

MyBuffer<5> fiveChars = getVal(); 
MyBuffer<10> tenChars = getVal(); 

私はコンパイルエラーを持っている:私は、コールは、例えば、次のように簡略化することができます。

私の質問: 最後のコードスニペットを使用できるようにテンプレートを宣言することは可能ですか?私はgetValテンプレートの型を指定していませんが、コンパイラーは、テンプレートの特殊化がある具体的な型にそれを割り当てています。

+4

あなたはGETVALを持っている可能性が() 'テンプレートオペレータMyBuffer ()とヘルパークラスを返す;' –

+1

C++ 0X? – StoryTeller

+1

[なぜコンパイラが戻り値の型からテンプレートパラメータを推測できないのですか?](https://stackoverflow.com/questions/45075703/why-cant-the-compiler-deduce @torytellerから返された@templateパラメータ) – Barmar

答えて

3

まず、戻り値のテンプレートパラメータは、C++に推論することはできません。単に使用

MyBuffer<5> fiveChars = getVal<MyBuffer<5>>(); 

template<int n> 
MyBuffer<n> get() 
{ 
    return getVal<MyBuffer<n>>(); 
} 

、代わりの:あなたはコードの量を減らしたい場合は

は、私はラッパーのいくつかの種類を使用することをお勧めし

auto fiveChars = get<5>(); 
auto tenChars = get<10>(); 
+0

Rokyan、ありがとう! –

1

MyBufferにコンストラクタを追加して、変換を行うことができます

template <std::size_t N> 
class MyBuffer 
{ 
public: 
    MyBuffer(const MyBuffer&) = default; 

    template <std::size_t M> 
    /* explicit */ MyBuffer(const MyBuffer<M>& rhs) : MyBuffer(rhs.data()) {} 

    // ... 
}; 

、その後

MyBuffer<10> buf = "1234567890"; 

const MyBuffer<10>& getVal() { return buf; } 

MyBuffer<5> fiveChars = getVal(); 
MyBuffer<10> tenChars = getVal(); 
関連する問題