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

标签 c++ templates c++17 c++14

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

相关文章:

c++ - makefile读取另一个目录

symfony - include标签和include函数有什么区别?

java - Spring项目模板不显示模板

c++ - 模板编译

c++ - 使用模板特化拆分可变参数包

c++ - Microsoft 推荐使用哪种 native API 来渲染 2D 图形?

c++ - 为 iOS 创建 Qt 5.1 应用程序

c++ - bool 类型的按位运算和逻辑运算相同吗?

c++ - 变体的 get<string> 在 clang++ 下失败,但在 g++ 下失败

c++ - 将多个数组转换为元组