2014-04-02 80 views
0

我可以使這樣的工作?解決功能模板部分專業化

template <int N, int Y> 
constexpr int f(char *(&arr)[Y]) 
{ 
    return N * f<N - 1, Y - 1>(); 
} 

// Y must appear here too because it's used in parameters 
// and if I remove this I get "no matching function" error 
template <int N, int Y> 
constexpr int f<1, 1>(char *(&arr)[Y]) // run this when Y == 0 and N == 0 
{     
    return 1; 
} 

int main() 
{ 
    size_t x = f<4,4>(); 
    printf("x = %zu\n", x); 
} 
+0

不是'Y'多餘? – legends2k

+0

@ legends2k:這是一個代碼示例。函數主體本身可能沒有多大意義 –

+0

你不能有一個大小爲0的數組,所以如果你需要'arr'參數,你需要專注於別的東西 - 也許''''''''''''1。此外,專業化應該是'template <>'(刪除'int N,int Y')。你需要提供一個數組,在給定調用的遞歸性質的情況下這應該很有趣 - 你可能需要對一個更短的數組進行轉換。 –

回答

2

通常有三種解決方案的部分功能專業化(本書雖然你似乎有充分的專業化):

std::enable_if/std::disable_if 

如:

template<int X, int Y> 
typename std::enable_if<X == 0 && Y == 0>::type 
int f(); 

委託執行一個struct(似乎乾淨給我):

template<int X, int Y> 
struct f_impl { 
    int eval(); 
}; 

template<int X, int Y> 
int f() { 
    return f_impl<x,Y>::eval(); 
} 

,然後部分專業實施

template<> 
struct f_impl<0,0>; 

轉發模板ARGS爲魔術函數指定參數和再實施重載:

template<int X, int Y> 
int f(mpl::int_<X>, mpl::int_<Y>); 

int f(mpl::int_<0>, mpl::int_<0>); 

template<int X, int Y> 
int f() { 
    f(mpl::int_<X>(), mpl::int_<Y>()); 
} 

參考boost::mpl更多的元編程幫手,如mpl::identity用於包裝類型:http://www.boost.org/doc/libs/1_55_0b1/libs/mpl/doc/index.html