gpt4 book ai didi

c++ - 非内置模板,内置重载

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:01 25 4
gpt4 key购买 nike

我正在提供一个支持函数 bar() 的库。当您传入一个标量值(如 double、int 等)时,它的作用与您传入非标量值(在所有预期情况下,用户定义的类型)时发生的情况不同。所以我写了这样的代码:

#include <iostream>

class Foo
{
public:
template <class T> void bar(T const &rhs) { std::cout << "T" << std::endl; }
void bar(double rhs) { std::cout << "double" << std::endl; }
};

int main()
{
Foo foo;
foo.bar(4);
}

问题出在 main() 的第二行。这段代码的结果是输出“T”。编译器更喜欢模板而不是对 bar(double) 的调用,我假设这是因为参数是一个 int,它宁愿转换为 int const&(因为 const& 可以引用右值)。

我的问题是“有没有一种方法可以支持每个标量值而无需明确调用它们?”我真的不想说出所有可能的类型,因为……好吧……有很多。我将不得不涵盖从 char 到 long long 的所有内容,包括 volatile 和 unsigned 的每种组合,等等。

我知道只需将 4 更改为 4.0 即可,但这是针对库的公共(public)接口(interface),并要求用户键入 4.0 而不是 4只是脏了。

最佳答案

是的,具有特征:

#include <type_traits>
#include <iostream>

class Foo
{
public:
template <class T>
typename std::enable_if<!std::is_scalar<T>::value, void>::type bar(T const & rhs)
{
std::cout << "T" << std::endl;
}

void bar(double rhs)
{
std::cout << "double" << std::endl;
}
};

类型有六种基本类别:标量、函数、数组、类、 union 和引用。和 void。他们每个人都有相应的特征。 See here for more details.

关于c++ - 非内置模板,内置重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13130604/

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