C++17 及以下
不幸的是,C++ 还不允许您将浮点类型用作非类型模板参数。也就是说,您可以通过将分子和分母接受为整数然后在类中执行“数学”以获得浮点值来伪造它。那看起来像
template<size_t numerator, size_t denominator = 1> // use a default value so you don't have to specify the denominator for whole values
class myClass
{
private:
float a;
public:
myClass(float _a = static_cast<float>(numerator) / denominator) : a(_a) {}
float getA(){return a;}
~myClass() {}
};
typedef myClass<5> Dummy;
int main(int argc, char const *argv[])
{
Dummy dummy; // notice this isn't Dummy dummy();. That makes a function, not a variable
std::cout << dummy.getA() << std::endl;
return 0;
}
如果你愿意,你也可以添加一个默认值,numerator
这样你就可以做到
// Pre C++17
myClass<> foo;
//C++17 and later
myClass foo;
C++20
现在我们可以使用浮点类型1,代码可以简化为:
template<float default_value = 0.0f>
class myClass
{
private:
float a;
public:
myClass(float _a = default_value) : a(_a) {}
float getA(){return a;}
~myClass() {}
};
typedef myClass<5.0f> Dummy;
int main(int argc, char const *argv[])
{
Dummy dummy;
std::cout << dummy.getA() << std::endl;
return 0;
}
1:实际上还没有编译器支持这一点,但根据标准是允许的