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: на самом деле это еще не поддерживается компиляторами, но это разрешено стандарт