我可以键入检查模板参数吗? (C++)[重复]

Posted

技术标签:

【中文标题】我可以键入检查模板参数吗? (C++)[重复]【英文标题】:Can I type check a template parameter? (C++) [duplicate] 【发布时间】: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 中使用 【参考方案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;。看: Const correctness 使用const &amp;,您可以匹配rvalue reference,就像在我的示例中一样。

C++14:您可以将if constexpr 替换为SFINAE。 Demo

#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 更快,如果您发布答案,我将删除它

【讨论】:

以上是关于我可以键入检查模板参数吗? (C++)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

模板参数固定的C++函数参数数量[重复]

C ++:检查输入数据[重复]

具有不同数量参数的函数中的 C++ 代码重复

带有函数指针和引用的模板参数推导[重复]

键入检查函数参数是“Pythonic”吗? [关闭]

键入文本时扩展的 CSS Textarea [重复]