我正在寫一個函數functor F,它接受void(func)(T)和func的參數arg的函數。從trait獲得const或非const引用類型
template<typename T>
void F(void (*func)(T), WhatTypeHere? arg)
{
func(arg);
}
然後functor F調用arg的func。我希望F不要複製arg,只是爲了傳遞它作爲參考。但是,我不能簡單地寫出「void F(void(* func)(T),T &)」,因爲T可能是一個參考。所以我想寫一個特性,它允許獲得的T適當的引用類型:
T -> T&
T& -> T&
const T -> const T&
const T& -> const T&
我想出了這樣的事情:
template<typename T>
struct type_op
{
typedef T& valid_ref_type;
};
template<typename T>
struct type_op<T&>
{
typedef typename type_op<T>::valid_ref_type valid_ref_type;
};
template<typename T>
struct type_op<const T>
{
typedef const T& valid_ref_type;
};
template<typename T>
struct type_op<const T&>
{
typedef const T& valid_ref_type;
};
template<typename T>
void F(void (*func)(T), typename type_op<T>::valid_ref_type arg)
{
func(arg);
}
其中例如不工作了
void a(int x) { std::cout << x << std::endl; }
F(&a, 7);
給錯誤:在通過參數2的類型從一個臨時類型「INT」的「INT &」的非const引用 無效初始化'void F(void(*)(T),typename type_op :: valid_ref_type)[with T = int]'
如何讓這個特徵起作用?
我認爲這是非常相似的這一個:http://stackoverflow.com/questions/2539361/c-template-functor-cannot-deduce-reference-type – 2010-04-17 12:25:52