有沒有辦法在定義所述模板成員函式“之后”為模板類的模板成員函式“注入”默認型別?
基本上與此類似(不編譯),因此我可以在定義模板類及其成員函式模板的庫之外指定NS::Default(默認型別):ZS
// In library
namespace NS {}
template<typename T>
struct S {
template<typename X, typename Z = NS::Default>
void foo(X x, Z z = Z{}) {}
};
// In user code
namespace NS {
using Default = int;
}
S<SomeClass> s;
s.foo(3.14); // z == int(0)
我想我曾經有過這樣的代碼與后來指定的型別特征一起使用,但已經有一段時間了,我的模板 foo 有點生疏了。
主要目標是能夠S::foo僅使用一個引數呼叫并讓它使用具有默認型別的默認引數,該型別不是由庫指定的,而是由使用代碼指定的。
通過類模板注入該型別當然是一種選擇,但不是我所要求的。所以我不想這樣做:
// library
template<typename T, typename ZDefault>
struct S {
template<typename X, typename Z = ZDefault>
void foo(X x, Z z = Z{}) {}
};
// User
S<SomeClass, int> s;
s.foo(3.14);
uj5u.com熱心網友回復:
您可以創建客戶應該定義/專門化的特征:
// In library
template <typename> struct DefaultType; // declaration without definition.
template<typename T>
struct S {
template<typename X, typename Z = typename DefaultType<X>::type>
void foo(X x, Z z = Z{}) {}
};
// In user code
template <typename> struct DefaultType
{
using type = int;
};
S<SomeClass> s;
s.foo(3.14); // z == int(0)
uj5u.com熱心網友回復:
如果您可以期望您的客戶完全控制他們的型別,您可以設計 lib 以便默認型別是T類模板的引數化型別的一部分S:
// In library
/// @attention `T` shall have a public alias declaration name `Default`
template<typename T>
struct S {
template<typename X, typename Z = typename T::Default>
void foo(X x, Z z = Z{}) {}
};
// In user code
// Default config for all my types: let my type inherit from this class.
struct DefaultConfig {
using Default = int;
};
struct SomeClass : DefaultConfig {};
int main() {
S<SomeClass> s;
s.foo(3.14); // z == int(0)
};
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/428008.html
