有没有一种方法可以在模板类的模板成员函数定义“之后”为模板成员函数“注入(inject)”默认类型?
基本上与此类似(不编译),因此我可以在库外指定 NS::Default
(Z
的默认类型)模板类S
及其成员函数模板定义:
// 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
并让它使用具有默认类型的默认参数,该类型不是由库指定的,而是由使用代码指定的.
通过类模板注入(inject)该类型当然是一种选择,但不是我所要求的。所以我不想做:
// 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);
最佳答案
您可以创建客户应定义/专门化的特征:
// 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)
关于c++ - 从用户代码注入(inject)默认模板参数类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71064243/