为不同版本的函数模板识别不同的默认参数

阿福雷

首先我有一个函数模板

template<typename S>
void foo(const S & s, int a = 1, double b = 2)

然后我想提供给定的专门实现S是一个 STL 容器。特别是,我想提供不同的默认参数。

由于在 C++ 中不允许部分函数模板特化,我只是重载foo.

template<typename T>
void foo(const vector<T> & s, int a = 3, double b = 4)

在这一点上一切都很好。

现在我想写一个函数模板partial_foo,它只接受一个参数double b = 6,然后让编译器a根据foo它调用的版本决定默认参数请注意,b是后a在的调用签名foo

template<typename S>
foo_partial(const S & s, double b = 6)

理想情况下,foo_partial(int)会有一个默认参数,int a = 1foo_partial(vector<int>())会有一个默认参数int a = 3

我的问题是:foo_partial鉴于foo?的设计,我可以这样做(即如何实现),或者是否有任何解决方法

对于一个具体的例子,请考虑

#include <bits/stdc++.h>
using namespace std;

template<typename S>
void foo(const S & s, int a = 1, double b = 2)
{
    printf("foo(S) with a = %d, b = %.0f\n", a, b);
}

template<typename T>
void foo(const vector<T> & t, int a = 3, double b = 4)
{
    printf("foo(vector<T>) with a = %d, b = %.0f\n", a, b);
}

template<typename S>
void foo_partial(const S & s, double b = 6)
{
    // how to implement foo_partial so that ____ corresponds to
    // the default argument in the proper version of foo?
    int ____ = 5;
    foo(s, ____, b);
}

int main()
{
    foo_partial(0);
    foo_partial(vector<int>());
}

输出是

foo(S) with a = 5, b = 6
foo(vector<T>) with a = 5, b = 6

我的问题相当于:有什么我可以用设计做的事情或任何解决方法,foo_partial以便输出

foo(vector) with a = 1, b = 6
foo(forward_list) with a = 3, b = 6

感谢您的时间!

艾伦·伯特尔斯

不要包含#include <bits/stdc++.h>它是非标准的并且在大多数平台上都不起作用。

using namespace std 也不推荐,因为它可能会导致未来的标准添加和您自己的代码之间发生冲突。

解决您的问题的一种方法是将您的默认参数移动到具有专业化的模板类:

#include <vector>
#include <cstdio>

using std::vector;

template <typename S>
struct defaults
{
    static constexpr int a = 1;
    static constexpr double b = 2;
};

template <typename T>
struct defaults<vector<T>>
{
    static constexpr int a = 3;
    static constexpr double b = 4;
};

template<typename S>
void foo(const S & s, int a = defaults<S>::a, double b = defaults<S>::b)
{
    printf("foo(S) with a = %d, b = %.0f\n", a, b);
}

template<typename T>
void foo(const vector<T> & t, int a = defaults<vector<T>>::a, double b = defaults<vector<T>>::b)
{
    printf("foo(vector<T>) with a = %d, b = %.0f\n", a, b);
}

template<typename S>
void foo_partial(const S & s, double b = 6)
{
    foo(s, defaults<S>::a, b);
}

int main()
{
    foo_partial(0);
    foo_partial(vector<int>());
}

如果您只是专门foo更改默认参数,则不再需要函数重载。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用默认参数的C ++函数模板

来自分类Dev

不同的可变参数模板扩展

来自分类Dev

函数模板的非最后默认模板参数

来自分类Dev

生成代码实例化具有不同参数的函数模板

来自分类Dev

为什么gcc和clang为函数模板的实例化生成不同的符号名称?

来自分类Dev

可变参数模板无法识别constexpr函数

来自分类Dev

根据C ++模板函数的参数类型解析为不同的类型

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

C ++重载函数和函数模板-不同的行为?

来自分类Dev

函数模板:默认第一个模板参数为第二个

来自分类Dev

函数模板:默认第一个模板参数为第二个

来自分类Dev

Lambda作为成员函数模板的默认参数

来自分类Dev

以成员函数指针为参数的可变参数模板

来自分类Dev

函数模板重载(不同的返回值类型)

来自分类Dev

使用不同的枚举参数时,VC ++函数模板实例化错误C2664

来自分类Dev

为每个可变参数模板参数调用函数,并将结果作为构造函数参数传递

来自分类Dev

函数模板无法识别左值

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

具有不同类型的非类型参数的C ++可变参数模板

来自分类Dev

可变参数模板与使用元组在参数中添加不同的数据对

来自分类Dev

不存在的标识符用作未实例化的函数模板中的默认参数

来自分类Dev

名称相同但参数类型与模板参数不同的多个函数

来自分类Dev

C ++可变参数模板:gcc和nvcc / intel中的不同优先级

来自分类Dev

如何使用可变参数模板定义不同类型向量的向量?

来自分类Dev

是否可以构建具有不同类型的可变参数模板?

来自分类Dev

为什么可变参数模板的模板专业化与非可变模板的专业化不同?

来自分类Dev

递归可变参数函数模板

来自分类Dev

编写可变参数模板构造函数

Related 相关文章

  1. 1

    使用默认参数的C ++函数模板

  2. 2

    不同的可变参数模板扩展

  3. 3

    函数模板的非最后默认模板参数

  4. 4

    生成代码实例化具有不同参数的函数模板

  5. 5

    为什么gcc和clang为函数模板的实例化生成不同的符号名称?

  6. 6

    可变参数模板无法识别constexpr函数

  7. 7

    根据C ++模板函数的参数类型解析为不同的类型

  8. 8

    C ++重载函数和函数模板-不同的行为?

  9. 9

    C ++重载函数和函数模板-不同的行为?

  10. 10

    函数模板:默认第一个模板参数为第二个

  11. 11

    函数模板:默认第一个模板参数为第二个

  12. 12

    Lambda作为成员函数模板的默认参数

  13. 13

    以成员函数指针为参数的可变参数模板

  14. 14

    函数模板重载(不同的返回值类型)

  15. 15

    使用不同的枚举参数时,VC ++函数模板实例化错误C2664

  16. 16

    为每个可变参数模板参数调用函数,并将结果作为构造函数参数传递

  17. 17

    函数模板无法识别左值

  18. 18

    C ++错误:函数模板中可能未使用默认模板参数

  19. 19

    C ++错误:函数模板中可能未使用默认模板参数

  20. 20

    具有不同类型的非类型参数的C ++可变参数模板

  21. 21

    可变参数模板与使用元组在参数中添加不同的数据对

  22. 22

    不存在的标识符用作未实例化的函数模板中的默认参数

  23. 23

    名称相同但参数类型与模板参数不同的多个函数

  24. 24

    C ++可变参数模板:gcc和nvcc / intel中的不同优先级

  25. 25

    如何使用可变参数模板定义不同类型向量的向量?

  26. 26

    是否可以构建具有不同类型的可变参数模板?

  27. 27

    为什么可变参数模板的模板专业化与非可变模板的专业化不同?

  28. 28

    递归可变参数函数模板

  29. 29

    编写可变参数模板构造函数

热门标签

归档