c++ - 模板参数中使用的 const & (ref)

标签 c++ templates

我在一些代码中看到了以下内容:

template<const Foo& bar>

有人告诉我它的目的是处理大型结构。

难道我们不能在代码中直接使用 const & 非模板化参数吗?
使用 const 引用作为模板参数将对象引用作为参数传递可以被认为是一种好的做法吗?

最佳答案

这是一个 non-type template parameter ,恰好是 const Foo& 类型。

无论它的用途是什么(“大结构”并不是真正的那个描述性的),像所有非类型模板参数一样,它的优点是在编译时可用(例如在元程序中),它的缺点是你必须在编译时有它的值。它是一个编译时常量可能也有助于编译器更好地优化它。

这里有一些例子:

struct Foo {};

/////////////////////////////////
// Type template parameter :
template <class T>
struct TypeParame {
    T const &tRef; // T is a type
};

/////////////////////////////////
// Non-type template parameters :

// Integral type
template <int I>
struct NonTypeParam {
    // I is a value
    enum { constant = I };
};

// Reference
template <Foo const &F>
struct RefParam {
    // F is a value again
    Foo const &ref = F;
};

// Pointer
template <Foo const *F>
struct PtrParam {
    // F is still a value
    Foo const *ptr = F;
};

// More are possible, but...

// error: 'struct Foo' is not a valid type for a template non-type parameter
template <Foo F>
struct ValParam {};

关于c++ - 模板参数中使用的 const & (ref),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29841605/

相关文章:

c++ - 模板处理函数 "returning"多于一个值

c++ - 将模板化类转换为更通用的特化

c++ - 如何学习linux网络栈源码

c++ - 如果有 vector ,那为什么会有数组?

c++ - 多态性和指向数组的指针

c++ - 如何在编译时检查函数是否在全局范围内声明

c++ - c++ 模板元编程是函数式编程的一种形式吗

c++ - 有没有办法获得给定数量的输入,其中数字在 C++ 的编译时由模板给出?

c++ - exe 上的字符串命令显示太多

c++ - 如何使用 makefile 在 C++ 中创建静态/动态库?