C++将模板类型限制为数字

Rya*_*ipp 4 c++ templates c++11

我的意思是这个,我在c ++中有一个函数,我想将钱存入账户.这个函数应该能够接受浮点数,双精度数,整数等,因为这些都是输入的有效形式,因为我需要的只是一个要存入的数字.

因此,我宣布:

template <typename type>
void Deposit(type t) {...}
Run Code Online (Sandbox Code Playgroud)

现在我唯一的问题是:从理论上讲,这个类的用户可以将char或字符串传递给此函数,并且会产生意想不到的后果.我如何将类型限制为整数,浮点数,双打和短裤?是否可以在函数定义中对此进行限制,以便其他人在使用此函数进行编程时获得编译器/链接器错误而不必使用try{...} catch(...){...}

Nat*_*ica 11

您需要std :: is_arithmetic将模板类型约束为算术类型(整数或浮点).你可以像使用它一样

template <typename T, typename std::enable_if<std::is_arithmetic<T>::value>::type* = nullptr>
void Deposit(T t) {...}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`std :: is_arithmetic`对于`bool`也是如此,这不是问题中列出的类型之一. (5认同)

Sla*_*ica 5

我担心你的方法是错误的,你应该class用金钱创建一个正确的工作(包括你的域的必要操作 - 添加,减去等),测试它,添加方法来打印它和/或转换为字符串,并使你的函数只接受该类型:

class Money {
    ...
};

void Deposit( Money amount );
Run Code Online (Sandbox Code Playgroud)

因此,通过添加构造函数,您可以控制可以接受的类型:

class Money {
public:
     explicit Money( double v );
     explicit Money( int64_t cents );
     Money( int64_t cents );
...
};
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以控制可以进行的转换,并且不仅可以针对此特定功能进行转换,还可以完成整个转换class.否则,您需要在许多功能中重新实现相同的逻辑(我怀疑您的系统只需要存储功能).