我可以从外部访问非类型模板 class 参数吗?如何?
Can I access a non-type template class argument from outside? How?
请检查以下代码:
#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
而无需像这样引入样板 getter?
constexpr static int getSize()
{
return Size;
}
你可以在class里面用模板参数的值定义一个constexpr static
变量,例如
template <int Size>
class Test
{
public:
constexpr static auto MySize = Size;
double array[Size];
};
然后你这样访问
using MyTestArray = Test<3>;
auto size = MyTestArray::MySize;
您需要一些样板文件。向 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>>;
}
您还可以使用 decltype
说明符,假设 MySize
变量是常量。类似于上面的例子post.
#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;
}
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
告诉编译器这是已知的 compile-time
auto
告诉编译器自动去除类型
请检查以下代码:
#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
而无需像这样引入样板 getter?
constexpr static int getSize()
{
return Size;
}
你可以在class里面用模板参数的值定义一个constexpr static
变量,例如
template <int Size>
class Test
{
public:
constexpr static auto MySize = Size;
double array[Size];
};
然后你这样访问
using MyTestArray = Test<3>;
auto size = MyTestArray::MySize;
您需要一些样板文件。向 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>>;
}
您还可以使用 decltype
说明符,假设 MySize
变量是常量。类似于上面的例子post.
#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;
}
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
告诉编译器这是已知的 compile-time
auto
告诉编译器自动去除类型