2011-01-10 64 views
0

結果類型我想專攻一個模板函數聲明爲:獲取的功能

template<typename Type> Type read(std::istream& is); 

然後我有很多的靜態實現

static int read_integer(std::istream& is); 

a.s.o.現在,我想要做一個宏這樣讀的是專業化是簡單的:

SPECIALIZE_READ(read_integer) 

所以我想我會去的boost :: function_traits方式並宣佈SPECIALIZE_READ爲:

#define SPECIALIZE_READ(read_function) \ 
    template<> boost::function_traits<read_function>::result_type read(std::istream& is) { \ 
     return read_function(is); \ 
    } 

但VC++(2008)編譯器抱怨:'boost :: function_traits':'read_integer'不是用於參數'Function'的有效模板類型參數

想法?

+0

那是因爲你傳遞一個值(read_function)作爲一種類型。它不會像C++ 03那樣工作。在C++ 0x中,你可以使用decltype(read_function)。 – ltjax 2011-01-10 15:27:35

+0

嗯,是嗎?我還應該通過什麼?我過去已經成功地將類函數與function_traits一起使用,並且我也將它用於函數,但我不知道爲什麼它在這種情況下不起作用...... – Robert 2011-01-10 19:07:04

回答

0

據我所知,沒有任何機制(C++ 0x中的decltype除外)從函數指針中獲取返回類型,而沒有傳遞與參數相同的函數指針。

最簡單的方法是接受的返回類型的重複:

#define SPECIALIZE_READ(type, read_function) \ 
    template<> type read(std::istream& is) { \ 
     return read_function(is); \ 
    } 

SPECIALIZE_READ(int, read_integer) 
0

也許我錯了,但是如果我記得我在C++編程載體中經歷過的事情,函數可能不會因返回類型的不同而被重載。我猜這些東西會起作用,如果你這樣做:

template<typename Type> void read(std::istream& is, Type& objectToRead); 

並使用Type作爲參數。如果我記得好的話,這與編譯器通常裝飾C++名稱的方式有關。

+0

實際上,函數模板僅基於返回類型非常頻繁,例如,在返回類型上使用enable_if慣用法時。 – ltjax 2011-01-10 15:24:27