2008-10-12 67 views
0

假設我有一個函數模板是這樣的:強迫模板類與運營商T *

template<class T> 
inline 
void 
doStuff(T* arr) 
{ 
    // stuff that needs to use sizeof(T) 
} 
在另一個 .h filee我有一個模板類 Foo

然後:

public: operator T*() const; 

現在,我意識到那些是不同的Ts。但是如果我在堆棧上有一個變量Foo<Bar> f,只能將它強制爲任何類型的指針調用operator T*()。然而,如果撥打doStuff(f),GCC會抱怨doStuff不能自動使用Foo<Bar>而不是自動使用運營商T*()強制爲Bar*,然後專用功能模板Bar作爲T

有什麼我可以做的,使這個工作與兩個模板?或者,模板函數的參數必須是實際的指針類型,還是要將帶有強制運算符的模板類傳遞給非模板函數?

回答

3

GCC是正確的。在模板參數中只考慮完全匹配,類型轉換不是。這是因爲否則就不得不考慮無限的(或至少是指數的)轉換量。

如果美孚< T>的是,你要在運行的唯一其他的模板,最好的解決辦法是添加:

template<typename T> inline void doStuff(const Foo<T>& arr) { 
    doStuff(static_cast<T*>(arr)); 
} 

如果您有大量的模板,這個問題這應該修復它:

#include <boost/type_traits/is_convertible.hpp> 
#include <boost/utility/enable_if.hpp> 
template<template <typename> class T, typename U> inline typename boost::enable_if<typename boost::is_convertible<T<U>, U*>::type>::type doStuff(const T<U>& arr) { 
    doStuff(static_cast<U*>(arr)); 
} 

這是一個有點冗長,但;-)

-1

我不知道爲什麼轉換不工作,但你可以使用過載來解決這個問題


template 
inline 
void 
doStuff(T& arrRef) 
{ 
    doStuff(&arrRef); 
} 
+0

解引用參考一般是壞風格。我知道黑客有它們的價值,但只是非常謹慎地使用。 – 2008-10-12 21:25:17

+0

此外,它是不正確的。語法上因爲您沒有在任何地方定義T,語義上是因爲Foo .operator&()不會返回T *,而是返回Foo *。 – 2008-10-12 22:07:39

-1

那麼,T *是不是在T你覺得它的意義上的獨立型是。指針是一個類型限定符。我不確定這個標準是怎麼說的,但我會說,因爲變量已經是T類型了,它不會再嘗試轉換。如果你想做一些自定義的東西來獲得指針,那麼就會使運算符超載。

+0

T *是從T中分離的類型,大家都認爲它是...... – 2008-10-12 22:06:42

2

這可能是值得一試:

doStuff<Bar>(f); 

我認爲這會導致編譯器期望T *爲Bar *,然後使用Foo的運算符T *()來執行強制轉換,但我不能說我已經嘗試過。

0

萊昂的想法可能是最好的。但在一個捏,你也可以明確地打電話給演員操作員:

doStuff(static_cast<Bar*>(f));