過程中使用非類型模板參數考慮以下struct
S:偏特
//Implementations provided elsewhere
struct A { A(int i, double d, std::string s); /* ... */ };
struct B { B(double d1, double d2); /* ... */ };
我有兩個轉換類,它們的模板簽名的樣子:
TupleAs< A, int, double, std::string > via1 { ... };
ArrayAs< B, double, 2 > via2 { ... };
可以預見的是,TupleAs
轉換的三重int
,double
和std::string
值轉換成A
類型的對象。同樣,ArrayAs
將一對兩個double
值轉換爲B
類型的對象。 (是的,是有原因的,我不能直接調用A
和B
構造函數)。
提高語法
我想改變語法,所以我可以做到以下幾點:
TupleAs< A(int,double,std::string) > via1 { ... };
ArrayAs< B(double,2) > via2 { ... };
我認爲這更多地描述了轉換過程。該TupleAs
模板聲明和相應的局部專業化應該是這樣的:
template <typename T> struct TupleAs;
template <typename T, typename ... Args>
struct TupleAs<T(Args...)> { ... };
編譯器錯誤
但是,如果我嘗試做與ArrayAs
版本類似的東西:
template <typename T> struct ArrayAs;
template <typename T, typename U, unsigned N>
struct ArrayAs<T(U,N)> { ... };
我嘗試實例化時在叮噹(3.6)中出現以下錯誤(ArrayAs< B(double,2)> test;
):
typeAs.cpp:14:22: error: unknown type name 'N'
struct ArrayAs<T(U,N)>{
^
typeAs.cpp:14:10: warning: class template partial specialization contains a template parameter that cannot be deduced; this partial specialization will never be used
struct ArrayAs<T(U,N)>{
^~~~~~~~~~~~~~~
typeAs.cpp:13:45: note: non-deducible template parameter 'N'
template<typename T, typename U, unsigned N>
^
gcc錯誤診斷有點不同,但我不會在這裏發表。我承認我的模板技能應該比他們更好,我也承認類似的std::function<B(double,2)>
聲明顯然是無稽之談。但有人可以告訴我爲什麼我不想讓特定的語法實現嗎?我查看了C++ 14標準,並且無法找到相關部分,而且我在解釋叮噹聲診斷消息時遇到了問題。
您正在專注於功能類型。函數類型的形式爲'type(types ...)',沒有空間存放整數。換句話說,在任何情況下,B(double,2)語法在C++中都沒有意義。錯誤消息可以承認更有意義。 – Quentin
你需要'2'作爲編譯時參數嗎? – sfjac