如何在C 11中仅接受模板中的数字和字符串

How to accept only numbers and strings in templates in C++11?

本文关键字:数字 字符串      更新时间:2023-10-16

正如Titlte所说的,在C 11中,如何声明仅接受数字(intlongfloatdouble(和字符串的模板?

template<typename T>
class CustomClass {
    public:
        T data;
};

将其放在类定义中的任何位置:

static_assert(std::is_arithmetic<T>::value ||
              std::is_same<T, std::string>::value,
              "Wrong argument type");

调整条件以品尝。

示例,使用模板部分专业化和模板默认值。

的东西
template <typename T, bool =    std::is_arithmetic<T>::value
                             || std::is_same<T, std::string>::value>
class CustomClass;
template <typename T>
class CustomClass<T, true>
 {
   public:
      T data;
 };

所以你可以拥有

CustomClass<int>  cci;
CustomClass<std::string>  ccs;
// CustomClass<std::istringstream>  cciss; // compilation error

我知道问题似乎特定于C 11。但是语言改善了。可以使用C 20的概念。(#include <concepts>(。

使用如下所示的需要的关键字,并应用条件。

requires std::integral<T> || std::floating_point<T> || std::is_convertible_v<T, std::string_view>

示例用法和测试:

//SAMPLE CLASS
class Sample
{
};
template<typename T>
//ALLOW INTEGER TYPES, FLOATING POINT TYPES, STRING TYPES.
requires std::integral<T> || std::floating_point<T> || std::is_convertible_v<T, std::string_view>
class CustomClass {
public:
    T data;
};
//ALLOWED
CustomClass<int> C_Int;
C_Int.data = 10;
//ALLOWED
CustomClass<std::string> C_Str;
C_Str.data = "Test";
//NOT ALLOWED UNLESS THE requires IS COMMENTED IN ABOVE CODE.
Sample s;
CustomClass<Sample> C_Sample;
C_Sample.data = s;