C ++模板函数别名作为可变参数模板参数

乔·西尔维

我正在尝试创建一个模板,允许调用者指定自己的格式正确的分配方法,但是在传递可变参数模板参数时遇到问题。

如果我不传递任何参数,那么一切都会按预期进行。但是,如果我传递一个或多个参数,则会收到编译错误“函数调用过多的参数”。

我究竟做错了什么?

#include <cstdio>
#include <memory>

template <typename T, typename... Args>
using allocator = std::unique_ptr<T>(Args...);

template <typename T, allocator<T> A, typename... Args>
std::unique_ptr<T> get(Args... args) {
  return A(args...);
}

int main() {
  auto up1 = get<int, std::make_unique<int>>();  // Works

  auto up2 = get<int, std::make_unique<int>>(1);  // Too many arguments
                                                  // expected 0, have 1

  printf("%d\n", *up1);
  printf("%d\n", *up2);
}
约翰·伦德伯格(Johan Lundberg)

相反,您可以允许并推导可能有状态的函子A的类型。再加上几个括号,但很难弄错这个错误:

#include <cstdio>
#include <memory>

template <typename T>
struct allocator{
    template<typename... Args>
    auto operator()(Args&&... args) const { 
        return std::make_unique<T>(std::forward<Args>(args)...);
    }
};

template <typename T, typename A = allocator<T>>
auto get(A a=A{}) {
    return [a](auto... args){ 
        return a(args...); 
    };
};


int main() {
  auto up0 = get<int>()(); 
  auto up1 = get<int>()(1); 
  auto up0b = get<int>(allocator<int>())();
  auto up1b = get<int>(allocator<int>())(1);
  auto up0c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })();
  auto up1c = get<int>([](auto ... args){ return std::make_unique<int>(args...); })(1);

  printf("%d\n", *up0);
  printf("%d\n", *up0b);
  printf("%d\n", *up0c);
  printf("%d\n", *up1);
  printf("%d\n", *up1b);
  printf("%d\n", *up1c);
}

还要注意,我make_unique使用in,allocator但是您可以创建一个接受指针来构造unique_ptrwith的版本。

在这里直播演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++模板函数别名作为可变参数模板参数

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

C ++可变参数模板参数迭代

来自分类Dev

C ++ 11模板别名作为模板模板参数导致不同的类型?

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

用可变参数模板在C ++中包装函数指针

来自分类Dev

通过可变参数模板的C ++ 11构造函数继承

来自分类Dev

C ++:可变参数模板和函数重载

来自分类Dev

调用类内的函数的C ++ 11可变参数模板

来自分类Dev

通过可变参数模板的C ++ 11构造函数继承

来自分类Dev

C ++ 11可变参数模板函数存储

来自分类Dev

C ++可变参数模板:无法匹配函数

来自分类Dev

c ++ 11递归可变参数模板

来自分类Dev

可变参数模板和C数组

来自分类Dev

C ++可变参数模板基础

来自分类Dev

C ++可变参数模板产品

来自分类Dev

C ++可变参数模板推导失败

来自分类Dev

c ++ 11递归可变参数模板

来自分类Dev

C ++-从可变参数模板制作Tupple

来自分类Dev

C ++结构函子作为函数模板参数

来自分类Dev

C++ 可变数量的可变参数模板参数

来自分类Dev

C ++:如何在可变参数模板参数上调用带有类型参数的函数?

来自分类Dev

为什么 C++ 可变参数模板不接受 iostream 值作为参数?

来自分类Dev

C ++在可变参数模板内部专门化可变参数模板

来自分类Dev

C ++:具有可变参数模板的成员函数指针参数

来自分类Dev

在C ++中可变参数模板中是否有对函数参数实施类型限制的好方法?

来自分类Dev

在C ++中使用可变参数模板迭代参数包

来自分类Dev

获取C ++可变参数模板参数的序数

来自分类Dev

线性层次结构的C ++可变参数模板参数

Related 相关文章

热门标签

归档