c++ - 偏特化不使用它的任何模板参数

标签 c++ c++11 variadic-templates template-meta-programming template-specialization

我正在尝试使用模板元编程实现元组,但索引函数有问题 get . Tuple的执行类型是这样的:

template<typename A, typename... B>
class Tuple : Tuple<B...> {
    private:
        A val;
    public:
        using Base = Tuple<B...>;
        Base* base() {
            return static_cast<Base*>(this);
        }
        const Base* base() const {
            return static_cast<const Base*>(this);
        }
        Tuple(A a, B... b): Base(b...), val(a) { }
        A first() {
            return val;
        }
};

template<class A>
class Tuple<A> {
    private:
        A val;
    public:
        Tuple(A a): val{a} {}
        A first() {
            return val;
        }
};

执行get结构是:

template<int N, class... A>
struct get {
    select<N,A...> operator()(Tuple<A...> t) {
        return get<N-1>()(t.base());
    }
};

template<class R, class... A>
struct get<0> {
    R operator()(Tuple<R, A...> t) {
        return t.first();
    }
};

这是编译器给我的错误:

tuple.cpp:53:8: error: partial specialization of 'get' does not use any of its template parameters
struct get<0> {
       ^
1 error generated.

为什么会出现此错误?我该如何纠正它?

备注:select<N,A...>是一个类型函数,它从 A 中选择第 N 个索引处的类型.

最佳答案

您的get 的主模板是:

template<int N, class... A>
struct get{ ... };

您的 get 的偏特化是:

template<class R, class... A>
struct get<0>{ ... };

特化接收单个模板参数,即:0,但上面的主模板采用两个模板参数:

  • 非类型模板参数N
  • 可变类型参数 A

此外,R如何推导出来?


get 专门化为:

template<class R, class... A>
struct get<0, R, A...>{ ... };

将使 R 被推导成为可能:它将被推导为传递的可变参数的第一个元素的类型。例如,在:

get<0, int, float, double> foo;

R 将推导为 int

关于c++ - 偏特化不使用它的任何模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49328379/

相关文章:

c++ - 尝试从文件中读取时出现超出范围错误?

c++ - C++中指向函数指针的指针

c++ - 如何将参数包扩展为 vector <any>

c++ - 为流运算符返回代理类时解包参数

c++ - 编写计算 nCr 值的程序 (C++)

c++ - 如何在不使用 VS C++ 2008 创建 MFC 文件的情况下创建资源

c++ - 在哪里可以找到有关 C++11、std 新功能和 Tr1 的可靠信息?

c++ - 如果构造函数因调用 std::make_shared 而崩溃,gdb 能否显示崩溃的详细信息

c++ - C++ 中指定初始化器的替代方案

boost::asio::basic_socket_acceptor::async_accept() 的接受处理程序中的 C++ boost::asio Variadic 模板运算符