2016-09-28 14 views
0

私は、メタプログラミングの階乗的な例に別のテンプレート引数を追加しようとします。しかし、以下のことはうまくいかない。正しい方法は何ですか?明示的な引数を1つ持つテンプレート

コード:

#include <iostream> 

template <typename T, int Depth> 
inline void loop(T i){ 
    std::cout << i; 
    loop<T, Depth-1>(i - 1); 
} 
template <typename T, int Depth> 
inline void loop<T, 0>(T i){ 
    std::cout << i << std::endl; 
} 

int main(void){ 
    int i = 10; 
    loop<int, 3>(i); 
} 

エラー:

test4.cpp(9): error: an explicit template argument list is not allowed on this declaration 
    inline void loop<T, 0>(T i){ 

答えて

6

あなたが部分的に特化することができない関数テンプレート。完全停止。 C++ 17では

、あなたが書くことができるようになります:

template <typename T> 
inline void loop(T i, std::integral_constant<int, 0>) { 
    std::cout << i << std::endl; 
} 

template <typename T, int Depth> 
inline void loop(T i, std::integral_constant<int, Depth>){ 
    std::cout << i; 
    loop(i - 1, std::integral_constant<int, Depth-1>{}); 
} 
+0

どのようにそのループを呼び出すのですか?主な機能はどのように見えるのですか? –

+0

'int main(void){ int i = 10;を使用するとエラーになります。 ループ(i、std :: integral_constant {}); } 'g ++ -std = C++ 14でコンパイルしてください。テンプレートインスタンシエーションの深さが900を超えています。 –

+0

@rxuコードが正常に動作するようになりました。 –

4

あなたが使用することができます。

template <typename T, int Depth> 
inline void loop(T i){ 
    std::cout << i; 
    if constexpr (Depth > 0) { 
     loop<T, Depth-1>(i - 1); 
    } 
} 

それまで、私はちょうどintegral_constant引数として深さを取る提案しますヘルパークラスとその専門分野は実際の作業を行うことができます。

template <typename T, int Depth> struct LoopHelper 
{ 
    static void doit(T i) 
    { 
     std::cout << i; 
     LoopHelper<T, Depth-1>::doit(i); 
    } 
}; 

template <typename T> struct LoopHelper<T,0> 
{ 
    static void doit(T i) 
    { 
     std::cout << i; 
    } 
}; 


template <typename T, int Depth> 
inline void loop(T i){ 
    LoopHelper<T, Depth>::doit(i); 
} 

追加洗練

私はTの控除を許可するようにloopを変更することをお勧めします。

template <int Depth, typename T> 
inline void loop(T i){ 
    LoopHelper<T, Depth>::doit(i); 
} 

次に、あなたが使用することができます。

int i = 10; 
loop<3>(i); 

Tintとして推定することができます。

+0

ループ(i); 'が動作します。 –

+0

@rxu、はい、そうです。私は答えを投稿する前にそれをテストしました。 –

関連する問題