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)
我担心你的方法是错误的,你应该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.否则,您需要在许多功能中重新实现相同的逻辑(我怀疑您的系统只需要存储功能).