2016-01-31 108 views
2

注意:如果純粹是爲了自我教育。以enum類爲模板參數縮短模板函數調用

我有以下模板:

template <typename T, T val> 
void Foo() { 
    static_assert(false, "You should not be here"); 
} 

,我想創造出衆多專業化,像這樣:

enum class ENUM { A, B }; 

template<> 
void Foo<ENUM, ENUM::A>() { 
    // something 
} 

此代碼與ENUM ::一個正常工作作爲模板參數,並正確地觸發static_assert,而不是與ENUM :: A一起調用。

的問題是 - 這樣的功能調用語法非常難看,就像這樣:

Foo<ENUM, ENUM::A>(); 

有什麼辦法縮短它只是

Foo<ENUM::A>(); 

但是,留下完整的想法,其他枚舉類型可以作爲模板參數傳遞。下面

代碼爲不是解決

template <ENUM val> 
void Foo() {} // and further specialize only for values of ENUM 

回答

1

不能想想辦法,你想這樣做完全是。然而,如果你願意投入一些努力(以一種可以緩解的方式,而且在下面),爲了使各種版本易於調用,你可以使用std::integral_constant來將事物分類;

#include <iostream>                                
#include <type_traits> 


using namespace std; 


enum class ENUM{ A, B }; 
using AT = integral_constant<ENUM, ENUM::A>; 
using BT = integral_constant<ENUM, ENUM::B>; 


template<typename T> 
void Foo(); 


template<> 
void Foo<AT>() 
{ 
    cout << "a" << endl; 
} 


int main() 
{ 
    Foo<AT>(); 

    return 0; 
} 

爲什麼這比以前更好?

  1. 您可能認爲這不是!

  2. 如果你打算寫很多代碼這些函數調用,這可能是一個保存。

  3. 編寫一個宏可以很容易地自動化頂部的那些using

相關問題