請檢查以下代碼:
#include <iostream>
template <int Size>
class Test
{
public:
// Will not compile, if Size is not a type!
// error: 'Size' does not name a type
using MySize = Size;
double array[Size];
};
using MyTestArray = Test<3>;
int main()
{
MyTestArray testArray;
std::cout << "Test array has size " << MyTestArray::MySize << std::endl;
return 0;
}
有沒有可能Size在不引入這樣的樣板吸氣劑的情況下從外部訪問?
constexpr static int getSize()
{
return Size;
}
uj5u.com熱心網友回復:
您可以在類中使用模板引數的值定義一個constexpr static變數,例如
template <int Size>
class Test
{
public:
constexpr static auto MySize = Size;
double array[Size];
};
然后你像這樣訪問
using MyTestArray = Test<3>;
auto size = MyTestArray::MySize;
uj5u.com熱心網友回復:
您還可以使用說明decltype符假設MySize變數具有常量性。與上述帖子類似的示例。
#include <iostream>
using namespace std;
template <int Size>
class Test
{
public:
static const decltype(Size) MySize = Size;
double array[Size];
};
using MyTestArray = Test<3>;
int main()
{
MyTestArray testArray;
std::cout << "Test array has size " << MyTestArray::MySize << std::endl;
return 0;
}
uj5u.com熱心網友回復:
你需要一些樣板檔案。要么添加一個靜態成員,Test要么如果你不想要,或者如果你不能修改Test,你可以使用型別特征:
#include <iostream>
template <int Size> class Test {};
template <typename T> struct MySize;
template <int Size> struct MySize<Test<Size>> { static constexpr const int value = Size; };
template <typename T> constexpr const int MySize_v = MySize<T>::value;
int main()
{
std::cout << MySize_v<Test<3>>;
}
uj5u.com熱心網友回復:
template <auto compile_time_known_parameter>
struct data
{
static constexpr auto value = compile_time_known_parameter;
};
int main() { return data<64>::value; }
static constexpr auto value = compile_time_known_parameter;
static告訴編譯器存盤必須在靜態記憶體中
constexpr告訴編譯器這是在編譯時已知的
auto告訴編譯器自動去使用型別
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/467038.html
下一篇:專門模板函式回傳向量
