- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一些模板类,如下所示
template<typename T>
class A{
public:
A(T a0, T a1, T a2):a0_(a0),a1_(a1),a2_(a2){}
private:
T a0_,a1_,a2_;
};
template<typename T>
class B{
public:
B(T a, std::vector<T> b):a_(a),b_(b){}
private:
T a_;
std::vector<T> b_;
};
template<typename T>
class C{
public:
C(T a, T b, std::vector<T> c):a_(a),b_(b),c_(c){}
private:
T a_,b_;
std::vector<T> c_;
};
一般来说,类构造函数有任意数量的参数,最后还有一个可选的 std::vector
。
我希望创建一个 getter 函数来分配上述类的一个实例。
template< typename C, typename... Args>
C* get(Args... args){
return new C(args...);
}
当显式创建/定义 vector 时,getter 函数编译成功。
A<int>* aa = get< A<int> >(1,2,3);
std::vector<int> v({1,2,3});
B<int>* bb = get< B<int> >(1,v);
C<int>* cc = get< C<int> >(1,2,v);
B<int>* bb = get< B<int> >(1,std::vector<int>({1,2,3}));
C<int>* cc = get< C<int> >(1,std::vector<int>({1,2,3}));
为了使用简单,我想使用初始化列表来定义B
和C
中的 vector 。这在直接调用构造函数时工作正常。
A<int>* aa = new A<int>(1,2,3);
B<int>* bb = new B<int>(1,{1,2,3});
C<int>* cc = new C<int>(1,2,{1,2,3});
然而,getter 函数给出了一个编译错误
B<int>* bb = get< B<int> >(1,{1,2,3});
C<int>* cc = get< C<int> >(1,2,{1,2,3});
error: too many arguments to function ‘C* get(Args ...) [with C = B; Args = {}]’
像下面这样创建一个处理 vector 的函数特化也不成功。
template< typename C, typename T, typename... Args>
C* get(Args... args, std::vector<T> v){
return new C(args...,v);
}
是否可以创建一个获取参数包和初始化列表作为最后一个参数并创建对象的 getter 函数?
我使用gcc 5.4编译。
最佳答案
我的建议是:initializer_list
首先。
如果您接受initializer_list
是 get()
的第一个参数,你可以把它写成
template <template<typename> class C, typename T, typename... Args>
C<T>* get(std::initializer_list<T> il, Args ... args){
return new C<T>(args..., il);
}
称其为
B<int>* bb = get<B, int>({1,2,3}, 1);
C<int>* cc = get<C, int>({1,2,3}, 1, 2);
如果你是initializer_list
在最后一个位置,扣除Args...
有问题类型包。
显然您需要另一个版本的 get()
对于不vector
C<T>
类。
OT 建议:您使用的是 C++11,因此您可以(我强烈建议)使用智能指针。
例如,使用 unique_ptr
, 你的 get()
函数可以变成
template <template<typename> class C, typename T, typename... Args>
std::unique_ptr<C<T>> get(std::initializer_list<T> il, Args ... args)
{ return std::unique_ptr<C<T>>(new C<T>(args..., il)); }
用法如下
std::unique_ptr<B<int>> bb { get<B, int >({1,2,3}, 1) };
std::unique_ptr<C<int>> cc { get<C, int >({1,2,3}, 1, 2) };
--- 编辑 ---
OP 询问
In any case, long story short, the answer to my question is: No, I cannot have the initializer_list last. Right?
永远不要说“我不能”但是...
如果你真的,真的想要 initializer_list
在最后一个位置......如果你能接受 Args...
参数被打包在 std::tuple
中...
template <std::size_t ...>
struct range
{ };
template <std::size_t N, std::size_t ... Next>
struct rangeH
{ using type = typename rangeH<N-1U, N-1U, Next ... >::type; };
template <std::size_t ... Next >
struct rangeH<0U, Next ... >
{ using type = range<Next ... >; };
template <template<typename> class C, typename T, typename ... Args,
std::size_t ... I>
std::unique_ptr<C<T>> getH(std::tuple<Args...> const & t,
std::initializer_list<T> const & il,
range<I...> const)
{ return std::unique_ptr<C<T>>(new C<T>(std::get<I>(t)..., il)); }
template <template<typename> class C, typename T, typename... Args>
std::unique_ptr<C<T>> get(std::tuple<Args...> const & t,
std::initializer_list<T> const & il)
{ return getH<C, T>(t, il, typename rangeH<sizeof...(Args)>::type()); }
用法如下
std::unique_ptr<B<int>> bb { get<B, int >(std::make_tuple(1), {1,2,3}) };
std::unique_ptr<C<int>> cc { get<C, int >(std::make_tuple(1, 2), {1,2,3}) };
但是......你真的需要initializer_list
是最后位置吗?
我认为最后一个解决方案很糟糕(与前面的相比)
关于c++ - 模板函数获取参数包和初始化列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914663/
我是 Spring 新手,这就是我想要做的事情: 我正在使用一个基于 Maven 的库,它有自己的 Spring 上下文和 Autowiring 字段。 它的bean配置文件是src/test/res
我在我的测试脚本中有以下列表初始化: newSequenceCore=["ls", "ns", "*", "cm", "*", "ov", "ov", "ov", "ov", "kd"] (代表要在控
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: Class construction with initial values 当我查看 http://en.
我得到了成员变量“objectCount”的限定错误。编译器还返回“ISO C++ 禁止非常量静态成员的类内初始化”。这是主类: #include #include "Tree.h" using n
我有如下所示的a.h class A { public: void doSomething()=0; }; 然后我有如下所示的b.h #include "a.h" class b: publi
我需要解析 Firebase DataSnapshot (一个 JSON 对象)转换成一个数据类,其属性包括 enum 和 list。所以我更喜欢通过传递 DataSnapshot 来手动解析它进入二
我使用 JQuery 一段时间了,我总是使用以下代码来初始化我的 javascript: $(document).ready( function() { // Initalisation logic
这里是 Objective-C 菜鸟。 为什么会这样: NSString *myString = [NSString alloc]; [myString initWithFormat:@"%f", s
我无法让核心数据支持的 NSArrayController 在我的代码中正常工作。下面是我的代码: pageArrayController = [[NSArrayController alloc] i
我对这一切都很陌生,并且无法将其安装到我的后端代码中。它去哪里?在我的页脚下面有我所有的 JS? 比如,这是什么意思: Popup initialization code should be exec
这可能是一个简单的问题,但是嘿,我是初学者。 所以我创建了一个程序来计算一些东西,它目前正在控制台中运行。我决定向其中添加一个用户界面,因此我使用 NetBeans IDE 中的内置功能创建了一个 J
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
据我所知, dependentObservable 在声明时会进行计算。但如果某些值尚不存在怎么办? 例如: var viewModel ={}; var dependentObservable1 =
我正在阅读 POODR 这本书,它使用旧语法进行默认值初始化。我想用新语法实现相同的功能。 class Gear attr_reader :chainring, :cog, :wheel de
我按照 polymer 教程的说明进行操作: https://www.polymer-project.org/3.0/start/install-3-0 (我跳过了可选部分) 但是,在我执行命令“po
很抱歉问到一个非常新手的Kotlin问题,但是我正在努力理解与构造函数和初始化有关的一些东西。 我有这个类和构造函数: class TestCaseBuilder constructor(
假设我们有一个包含 30 列和 30 行的网格。 生命游戏规则简而言之: 一个小区有八个相邻小区 当一个细胞拥有三个存活的相邻细胞时,该细胞就会存活 如果一个细胞恰好有两个或三个活的相邻细胞,那么它就
我是 MQTT 和 Android 开放附件“AOA” 的新手。在阅读教程时,我意识到,在尝试写入 ByteArrayOutputStream 类型的变量之前,应该写入 0 或 0x00首先到该变量。
我有 2 个 Controller ,TEST1Controller 和 TEST2Controller 在TEST2Controller中,我有一个initialize()函数设置属性值。 如果我尝
我有一个inotify /内核问题。我正在使用“inotify” Python项目进行观察,但是,我的问题仍然是固有的关于inotify内核实现的核心。 Python inotify项目处理递归ino
我是一名优秀的程序员,十分优秀!