我想定義可以用於任意類型的自定義常量(例如float
,double
等)。作爲一個例子,假設我想定義一個常量,其值爲pi。沒有C++ 14的定義模板常量的正確方法?
明顯的解決方案是使用#define pi 3.14159265359
,但然後pi
不會在名稱空間中,我冒着名稱衝突的風險。我沒有使用C++ 14,所以我不能使用variable template。我能想到做到這一點,最好的辦法是這樣的:
#include <iostream>
using namespace std;
namespace constants {
template<typename T> T pi() {
return 3.14159265359;
}
}
int main() {
float pitest = 0;
pitest = constants::pi<float>();
cout << pitest << endl;
cout << constants::pi<long double>() << endl;
cout << constants::pi<int>() << endl;
return 0;
}
我現在可以在命名空間中定義這些常量,我可以使用任意(數值)爲需要的類型。然而,這至少有兩個不希望的特徵:
- 它需要一個不應該是必要的函數調用(它只是一個常量!)。
- 即使函數正在返回已知類型的變量,我也必須在函數調用中指定類型。例如,在上面的代碼中,我必須使用
pitest = constants::pi<float>();
而不是簡單的pitest = constants::pi();
,即使pitest
顯然是float
。
有沒有更好的方法來做到這一點?
對於我打算使用這些常量而言,這有點矯枉過正,但對於超出範圍而言是+1。 – Null 2014-09-19 19:46:55
@Null沒有像過度工程這樣的殺戮。 – Yakk 2014-09-19 19:55:18