gpt4 book ai didi

c++ - 从用户代码注入(inject)默认模板参数类型

转载 作者:行者123 更新时间:2023-12-02 15:59:12 25 4
gpt4 key购买 nike

有没有一种方法可以在模板类的模板成员函数定义“之后”为模板成员函数“注入(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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com