我对模板元编程很陌生。在研究它时,我遇到了一个小代码块,它决定了编译时的类型。我的问题是,这个类型的人在这里是如何工作的。程序执行的顺序是什么?
#include <iostream>
using namespace std;
template <bool condition, class Then, class Else>
struct IF
{
typedef Then RET;
};
template <class Then, class Else>
struct IF<false, Then, Else>
{
typ
如果我在类或结构中使用typedef或using,我有时希望它独立于用于该类或结构的模板。
在下面的示例中,我将使用Object<T>::RefCountT,它可以工作,但在本例中我更愿意使用类似Object::RefCountT的方法,因为这样我就不必随意选择类型(在阅读时可能会感到困惑)。
template <typename T>
struct Object {
using RefCountT = unsigned short; // This is independent of T
};
对我来说,显而易见的(但不是理想的)解决方案就是在类之外定义它,就
下一节课
template<typename T>
class test {
public:
using unit = std::micro;
};
如何访问像test::unit这样的单元,而不必指定模板参数或使其成为模板别名。请注意,插入一个像这样的虚拟模板参数。int不是一个选项,因为某些模板类不能用这些类型实例化。
假设我们有一个名为TypeCollection的类,它包含一个打包的类型模板: template<typename ...Types>
class TypeCollection {}; 如果我们有一个模板TypeCollection的类,你需要做一些类似这样的事情: template<template<typename ...> class Collection, typename ...Types>
class CollectionHandler {}; 它将像这样实例化: CollectionHandler<TypeCollecion, A, B
考虑以下c++程序:
class A
{
protected:
int x;
};
template<typename X>
using B = A;
template<typename T>
class C : public B<T>
{
public:
void f()
{
x = 0;
}
};
int main()
{
}
当使用clang和gcc使用-std=c++17 -pedantic-errors作为编译选项进行编译时,它们的行为有所
我很好奇,并查看了std::vector的实现细节。我不太理解这些代码,但我对“使用”声明感到困惑。我看到很多类也在它们的类中包含这些using语句或typedef。在类中使用using声明有什么意义?它是否引入了一个新的成员变量?我对它的工作方式感到困惑。
using iterator = _Vector_iterator<_Scary_val>;
using const_iterator = _Vector_const_iterator<_Scary_val>;
using reverse_iterator =
我已经仔细阅读了许多关于这个主题的答案,但我仍然不能准确地计算出这两个关键字在作为嵌套模板类成员的非模板函数的作用域中是不是需要的。
我的参考编译器是GNU g++ 4.9.2和clang 3.5.0。
在下面的代码中,它们的行为几乎没有什么不同,我在代码中嵌入了注释,试图解释发生了什么。
#include <iostream>
// a simple template class with a public member template struct
template <class Z>
class Pa
{
// anything
public:
tem
我有一个模板函数template< template< class > class Timg, class T > Timg< T > foo(),编译器不能对其推断类型。我可以用foo< object, T >()调用这个函数,其中object是一个模板类。我希望能够使用decltype或类似的方法调用这个函数。
这里有一个例子:第一个文件是header.h
template< class T >
class object
{
};
template< template< class > class Timg,
我用类似于std::list的API实现了一个列表,但是它无法编译
struct A { my_list<A> v; };
这个列表有一个基类,它有一个成员,一个base_node,它有prev和next字段,node (从base_node派生)保存T值(这是列表的模板参数)。编译错误是
error: ‘node<T>::val’ has incomplete type
T val;
^~~
note: forward declaration of ‘struct A’
我看了GCC代码,它们似乎有一个T大小的字节缓冲区,所以不确定它是如何工作
如果这是重复的话,请提前道歉--我在这里找不到答案。我有以下课程:
template <typename T>
class A {
public:
using X = double;
private:
T x;
};
现在,我想获得A<T>::X。这可以不声明T吗?
我试了一些类似的东西:
template <typename T>
using B = A<T>::X;
B e = 0;
但是,如果不指定模板,这显然是行不通的。