c++ - 重载模板函数,根据模板参数具有不同的返回类型

标签 c++

<分区>

我有一个接受参数的函数。有时它是一个“原始”数字,有时它是一个包装在持有人类中的数字,其中包含一些关于数字的元信息。我可以像这样区分这两种情况

template<class T>
struct Holder
{
};

template<class T>
void f1(T)
{
}

template<class T>
void f1(Holder<T>)
{
}

但是,现在我想根据用户的需要返回原始数字或持有人。我知道用户在调用函数时必须明确指定模板参数。很好,但我希望函数尽可能具有相同的名称。像这样

template<class T>
T f1()
{
    return T();
}

template<class T>
Holder<T> f1()
{
    return T();
}

但是,称它为 f1<int>();f1<Holder<int>>();结果 error: ambiguous call to overloaded function

这是否可以在不更改函数名称的情况下实现? (如果不是,也没什么大不了的,我只是好奇)

最佳答案

除了使用 SFINAE (std::enable_if) 的方法外,您还可以使用偏特化。由于函数模板无法实现部分特化,因此它需要一些技巧,不过:

template <typename T>
struct f1_specialization {
    static T f1() { ... }
};
template <typename T>
struct f1_specialization<Holder<T>> {
    static Holder<T> f1() { ... }
};
template <typename T>
T f1() { return f1_specialization<T>::f1(); }

这两种方法可能或多或少都清晰,但它们都应该有效。

关于c++ - 重载模板函数,根据模板参数具有不同的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18832543/

相关文章:

c# - 当结构仅在运行时已知时,将结构从 C++ 传递到 C#

c++ - GDB 可以调试 C++ lambdas 吗?

c++ - 使用类的对象作为方法中的参数

c++ - 在多线程中添加到 vector

c++ - 手册中的 Libzip zip_dir_add 未声明 - C/C++

C++ 编译器命令顺序不一致

c++ - 无符号长按位运算符?

c++ - 如何防止类中的类对象尝试在没有默认构造函数的情况下自动构造自身?

c++ - 在 C 或 C++ 中创建目录

c++ - boost::regex 与 UTF-8 不区分大小写匹配(例如,大写与小写变音)