涉及模板参数的模板参数

template argument involving template parameters

本文关键字:参数      更新时间:2023-10-16

在部分专业化的模板参数中使用模板参数时,有没有办法解决标准的限制?我想让它工作的代码是这样的:

template<typename L, size_t offset, typename enable_if< (offset<sizeof(L)), int >::type =0>
class a{};
template<typename L>
class a<L, sizeof(L)-1>{};

由于它是C++11,您可以简单地使用static_assert作为泛型条件。对于sizeof(L)-1,您需要使用enable_if技巧,因为它需要一些专门化的东西。示例:

#include <cstdlib>
#include <type_traits>
#include <cstdio>
template <typename L, size_t offset, typename = void>
class a
{
    static_assert(offset < sizeof(L), "something's wrong");
public:
    void f()
    {
        printf("genericn");
    }
};
template <typename L, size_t offset>
class a<L, offset, typename std::enable_if<offset == sizeof(L)-1>::type>
{
    // note: the static_assert is *not* inherited here.
public:
    void f()
    {
        printf("specializedn");
    }
};
int main()
{
    static_assert(sizeof(int) == 4, "oops");
    a<int, 3> x;
    a<int, 2> y;
    x.f();
    y.f();
    return 0;
}

演示:http://ideone.com/D2cs5

我不知道这是不是你的意思。如果第二个模板自变量与第一个模板自变量-1的大小匹配,您可以通过这种方式选择不同的实现。

template<typename L, size_t offset>
class aImplMatch
{   // choose this if offset == sizeof(L) - 1
    L v;
};
template<typename L, size_t offset>
class aImpl
{  
    L v;
    char off[offset];
};
template<typename L, size_t offset, size_t i>
struct SelectImpl{};
template<typename L, size_t offset>
struct SelectImpl<L, offset, 0> { typedef aImplMatch<L, offset> Result; };
template<typename L, size_t offset>
struct SelectImpl<L, offset, 1> { typedef aImpl<L, offset> Result; };
template<typename L, size_t offset>
class a
{
    enum {I = offset == sizeof(offset) - 1 ? 0 : 1 };
    typedef typename SelectImpl<L, offset, I>::Result Impl;
    Impl impl;
};

也许它可以做得更好/更容易,这是我的第一个想法。。。