2010-12-04 24 views
3

我想要一個帶有這個接口的函數。如何用可選編譯時參數聲明模板化函數?

func<Type1,CompileOption>(Type2 value) 
//or 
func<Type1>(Type2 value) 

第一個編譯時參數是一個類型。這是每個函數調用都需要的。
第二個編譯時間參數是可選的。它用於修改func的行爲。
該函數本身以常規參數的類型(Type2)爲模板。

是否可以構建這樣的界面?

如果它不能有辦法得到類似的行爲?例如像一個模板函數,它需要兩個編譯時間參數,其中第二個是可選的?

幼稚的方法不起作用。

// invalid syntax 
template< typename Type1, typename CompileOption = Default, typename Type2> 
void func(Type2 t2); 

// Does the wrong thing. 
// CompileOption Parameter now change Type2. 
template< typename Type1, typename Type2, typename CompileOption = Default> 
void func(Type2 t2); 

//This kinda expresses what I'm looking for 
template<typename Type2> 
template<typename Type1, typename Optional = Default > 
void func(Type2 t2); 
+1

第一個選項不是無效語法。假設您使用C++ 0x編譯器(因爲您似乎允許在函數模板中使用默認模板參數),您還可以使用默認參數來表示非尾隨模板參數。 – 2010-12-04 18:41:19

回答

0

我一直在想這個問題,也讓其他人感到困惑。除非使用C++ 0x擴展,否則不可能編寫一個函數。然而,用兩個重載函數編寫它是非常簡單的。

template< typename Type1, typename Option, typename Type2 > 
void func(Type2 t2) 
{ /* ... */ } 

template< typename Type1, typename Type2 > 
void func(Type2 t2) 
{ func<Type1,Default,Type2>(t2); } 

func<int,fast_t>(20.f); 
func<float>(30); // uses Default as Option 
func<float,Default>(30); //exact same call as above. 
1

你的意思是這樣的嗎?

template<typename Type1, typename Type2, typename Option> 
void foo (Type2 arg) 
{ 
    ... code ... 
} 

template<typename Type1, typename Type2> 
void foo (Type2 arg) 
{ 
    foo<Type1, Type2, DefaultOption>(arg); 
} 

編輯:上面的代碼片段有效,但缺點是Type2需要在調用中明確指定。

我不得不承認,我想不出一個好的全模板解決方案,最接近我能得到使用空方法的參數:

struct DefaultOption { ... } DEFAULT; 
struct OtherOption { ... } OTHER; 

template<typename Type1, typename Type2, typename Option> 
void foo (Type2 arg, Option) 
{ 
    ... code ... 
} 

template<typename Type1, typename Type2> 
void foo (Type2 arg) 
{ 
    foo<Type1, Type2>(arg, DEFAULT); 
} 

這允許調用形式

foo<std::string>(1, DEFAULT); 
foo<std::string>(1.0, OTHER); 
foo<std::string>("Hello"); 

我很好奇,是什麼真正的答案,這讓人不解的是。

+0

接近我想要但不完全。它希望能夠像這樣調用`foo`:`foo (42)`或`foo (42.f)`。 – 2010-12-04 00:58:57

1

你總是可以嘗試

template<typename Type1, typename Optional = Default > 
struct A 
{ 
    template<typename Type2> 
    void func(Type2 t2) { 
     // function body 
    } 
}; 

也許這就是你需要的。

相關問題