【问题标题】:Can I type check a template parameter? (C++) [duplicate]我可以键入检查模板参数吗? (C++)[重复]
【发布时间】:2021-01-19 08:56:31
【问题描述】:

我想检查给定变量是否为字符。现在,我的函数根据向量的元素返回一个字符串。

问题是如果我给它一个 char 向量,那么 to_string() 会给我字符 'foo' 的数值。所以我希望它在哪里阅读:

a b

它改为读取

97 98

我宁愿在函数中实现一些东西而不是创建重载,因为我已经为参数类型 vector<vector<T>>vector<array<T, 2>> 提供了另外两个重载,它们需要按相同的逻辑运行,总共有六个会很混乱功能而不是三个。

   /** to string for vector that has singular elements
     * vtos : vector to string
     **/
    template <class T>
    basic_string<char> vtos (vector<T> &v )
    {
        string ret;
        int i = 0;
    
        for ( T& foo: v )
        {
            ret.append(to_string(foo) + " ");
            if (++i % 10 ==0)
                ret.push_back('\n');
        }
    
        return ret;
    }

++++++++++++++++++++++++++++++++++++++

编辑: 如果您有 C++17,则可以使用标记的解决方案。我没有,所以我决定只使用默认参数。

编辑 2:标记的答案现在还包括一个编辑,在那里检查 c++17 之前的答案。我自己的也会留在这里。

template <class T>
basic_string<char> vtos (vector<T> &v, bool isChar=false)
{
    string ret;
    int i = 0;

    for ( T& foo: v )
    {
        if (isChar)
            ret.push_back(foo);
        else
            ret.append(to_string(foo));

        ret.push_back(' ');

        if (++i % 10 ==0)
            ret.push_back('\n');
    }

    return ret;
}

【问题讨论】:

  • basic_string&lt;char&gt; 只是string BTW。
  • if constexpr (std::is_same_v&lt;T, char&gt;) ... ?或者添加 my_to_string 并为 char 重载。
  • 我没有安装 C++17,无法使用该解决方案。而是决定简单地添加一个默认的布尔参数 isChar,因为我只需要知道一个特定的情况。谢谢大家的回答
  • 我已更新我的帖子以包含 c++14 解决方案。如果将is_same_v&lt;&gt; 替换为is_same&lt;&gt;::value,它也可以在c++11 中使用

标签: c++ templates char append tostring


【解决方案1】:

您可以尝试使用if constexpr 和类型特征is_same

#include <iostream>
#include <type_traits>
#include <vector>


template <class T>
std::string vtos (const std::vector<T> &v )
{
    std::string ret;
    int i = 0;
    auto to_string = [](const auto& elem)
    {
       if constexpr ( std::is_same_v<T,char> )
       {
           return std::string(1,elem);
       }
       else
       {
          return std::to_string(elem);   
       }
    };
    for (const T& foo: v )
    {
        ret.append(to_string(foo) + " ");
        if (++i % 10 ==0) ret.push_back('\n');
    }
    return ret;
}
int main()
{
   std::cout << vtos(std::vector<char>{'a','b'});
}

注意

  • 不要使用using namespace std;。见this post
  • 如果不需要修改,请使用const &amp; 而不是&amp;。看:

C++14:您可以将if constexpr 替换为SFINAEDemo

#include <iostream>
#include <type_traits>
#include <vector>

template <class T> 
std::enable_if_t<std::is_same_v<T,char>, std::string>  to_string(const T& elem)
{
    return std::string(1,elem); 
}

template <class T> 
std::enable_if_t<not std::is_same_v<T,char>, std::string> to_string(const T& elem)
{
    return std::to_string(elem); 
}

template <class T>
std::string vtos (const std::vector<T> &v )
{
    std::string ret;
    int i = 0;
    for (const T& foo: v )
    {
        ret.append(to_string(foo) + " ");
        if (++i % 10 ==0) ret.push_back('\n');
    }
    return ret;
}
int main()
{
   std::cout << vtos(std::vector<char>{'a','b'});
   std::cout << vtos(std::vector<int>{12,5});
}

编辑:Evg 更快,如果您发布答案,我将删除它

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 2017-07-01
    • 2023-03-07
    相关资源
    最近更新 更多