2015-12-19 15 views
0

我在看下面的模板功能,並想知道幕後發生的事情,當我們分配enable_if型到typename關鍵字:分配一個類型到typename關鍵字

template <typename T, typename = std::enable_if<std::is_pointer<T>::value>::type> 
        // ^^ What happens here? 
void foo() 
{ 
    std::cout << "T is a pointer!" << std::endl; 
} 

其他則明顯SFINAE,編譯器是否真的用它做了什麼?也許它會產生某種匿名類型?

感謝

+0

這是一個默認參數[未命名的模板參數](http://stackoverflow.com/questions/6718094/anonymous-template-typename-class-declarations)。 – LogicStuff

回答

3

我假設你使用的是一個寬鬆的編譯器,它不會在=之後抱怨丟失的typename關鍵字。

它是一個未命名的模板參數,如果沒有指定其他模板參數,它將與默認的模板參數一起被忽略。

這意味着foo<void *>()解析爲foo<void *, std::enable_if<std::is_pointer<void *>::value>::type>(),即foo<void *, void>()

這意味着foo<int>()將解析爲foo<int, std::enable_if<std::is_pointer<int>::value>::type>(),除非它被拒絕,因爲std::enable_if<std::is_pointer<int>::value>沒有任何type成員。

這意味着foo<int, int>()工作和打印「T是指針!」,因爲如果明確指定了模板參數,則不使用默認參數。

最後一個意思是這可能不是一個好主意。

+0

所以,無論如何,我可以完成同樣的事情(禁止非指針類型的模板實例化)沒有默認參數(所以你的'foo ()'示例也會失敗)? –

+1

@user通常的做法是將'enable_if'放在返回類型中,而不是模板默認參數:'template auto foo() - > std :: enable_if_t > {...} 。調用者不能指定不同的返回類型。 (你可能需要在你的問題中使用'enable_if <...> :: type'和'is_pointer <...> :: value',如果你的實現的庫沒有被更新以允許新的更短的表單。) – hvd

+0

Meh,'foo () 「對我來說,堅定地在馬基雅維利領土上。 –

1

不,我們不分配enable_if型的typename關鍵字,模板參數只是在這裏ommitted,因爲它不會被用於:

template <typename T, typename Anonymous_Template_Parameter = std::enable_if<std::is_pointer<T>::value>::type> 
//        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

而且=品牌std::enable_if<std::is_pointer<T>::value>::type>作爲其默認參數。

相關問題