const& (ref)用于模板参数

时间:2015-04-24 07:44:47

标签: c++ templates

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

template<const Foo& bar>

我被告知其目的是处理大型结构。

我们不能再使用const&amp;直接在代码中非模板化的论点?
使用const引用作为模板参数将参数引用作为参数传递是否是一种好的做法?

1 个答案:

答案 0 :(得分:2)

这是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 {};