首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调用非模板方法而不是模板方法?

如何调用非模板方法而不是模板方法?
EN

Stack Overflow用户
提问于 2020-04-13 17:56:36
回答 3查看 66关注 0票数 1

我有两个名为writeLine()的函数。我以为main()中的行会调用第一个writeLine(),但它会调用第二个writeLine()。如何调用第一个writeLine()函数?我只是好奇,所以我知道以后是否可能。下面是一个很小的例子:

代码语言:javascript
复制
#include <iostream> 
#include <cstdarg>

void writeLine(const char *format, ...)
{
    va_list args;
    va_start(args, format);
    vprintf(format, args);
}

template <typename Key, typename Value>
void writeLine(const Key &key, const Value &value, const char *separator = " ")
{
    std::cout << key << separator << value << std::endl;
}

int main()
{
    writeLine("%s is a test.", "This");

    return 0;
}

预期输出:“这是一个测试。”

当前输出:"%s是一个测试。“

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-04-13 18:09:31

可以将函数模板限制为非char const *类型,

代码语言:javascript
复制
template <typename Key, typename Value>
std::enable_if_t<std::negation_v<std::is_same<std::decay_t<Key> , char *>>, void>
  writeLine(const Key &key, const Value &value, const char *separator = " ")
{
    std::cout << key << separator << value << std::endl;
}

因此,非模板函数是唯一的选项。

这是一个工作的演示

票数 3
EN

Stack Overflow用户

发布于 2020-04-13 18:03:56

你可能读过函数

1)对于F1的该参数,至少有一个参数的隐式转换优于相应的隐式转换。

后来

2)用户定义的转换序列总是优于省略号转换序列。

  • 模板重载完全匹配。
  • C-省略超载有省略转换.

模板重载是一个最好的可行功能。

您必须将模板函数从可行的重载中丢弃。

代码语言:javascript
复制
template <typename Key, typename Value,
          std::enable_if_t<!std::is_same_v<const char*, Key>, int> = 0>
void writeLine(const Key &key, const Value &value, const char *separator = " ")
{
    std::cout << key << separator << value << std::endl;
}
票数 0
EN

Stack Overflow用户

发布于 2020-04-13 18:37:31

正如所指出的,您需要对模板进行约束。当在这里传递字符串文字时,它将被推断为const&到char数组,因此我们需要使用std::is_array或创建我们自己的类型特征来专门针对char数组。

代码语言:javascript
复制
#include <iostream> 
#include <cstdarg>

void writeLine(const char *format, ...)
{
    va_list args;
    va_start(args, format);
    vprintf(format, args);
}

template <typename T>
constexpr bool is_char_array_v = false;

template <std::size_t N>
constexpr bool is_char_array_v<char[N]> = true;

template <typename Key, typename Value, std::enable_if_t<!std::is_same_v<Key, const char*>, int> = 0>
void writeLine(const Key &key, const Value &value, const char *separator = " ")
{
    std::cout << key << separator << value << std::endl;
}

int main()
{
    writeLine("%s Hey", "This");

    return 0;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61193745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档