gpt4 book ai didi

c++ - 使用专用和非专用类型的模板重载

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:42:43 26 4
gpt4 key购买 nike

template < typename...dummy >
class wrapper;

template < typename TYPE >
class wrapper < TYPE > {};

template < template < typename... > class TYPE, typename... PARAMS >
class wrapper < TYPE < PARAMS... > > {};

template < typename >
class templated_class {};
class normal_class {};

typedef wrapper < normal_class > normal_wrapper;
typedef wrapper < templated_class, int > templated_wrapper;

编译上面的结果明显在报错

'templated_class': class template ( not specialized ) cannot be a template argument for 'dummy', an actual type was expected

我怎样才能使它工作 wrapper可以接受normal_classtemplated_class作为第一个参数?我觉得有一个简单的方法,但我没有看到它,因为我对这个问题太着迷了。

我不能只写的原因

typedef wrapper < templated_class < int > > templated_wrapper;

是因为 typedef 是由可变参数宏创建的,它 - 出于 MCVE 目的而被剥离 - 看起来像这样:

#define first_va(f,...) f
#define createwrapper(...) \
typedef wrapper < __VA_ARGS__ > first_va(__VA_ARGS__)_wrapper;

createwrapper(normal_class)
createwrapper(templated_class,int)

而且我不知道如何执行预处理器魔法以在 <> 中的第一个参数之后包含所有参数,如果可能的话。

使用模板或宏的解决方案对我来说都是可以接受的,尽管我更喜欢模板解决方案。

最佳答案

#define createwrapper_single(f) \
typedef wrapper<f> f##_wrapper;
#define createwrapper_multiple(f, ...) \
typedef wrapper<f<__VA_ARGS__> > f##_wrapper;

#define pick_createwrapper(_1, _2, _3, _4, _5, _6, _7, _8, _9, _10, NAME, ...) NAME
#define createwrapper(...) \
pick_createwrapper(__VA_ARGS__, createwrapper_multiple, createwrapper_multiple, \
createwrapper_multiple, createwrapper_multiple, createwrapper_multiple, \
createwrapper_multiple, createwrapper_multiple, createwrapper_multiple, \
createwrapper_multiple, createwrapper_single, something_is_wrong_if_this_is_used)(__VA_ARGS__)

Demo .很明显,如果您疯狂到编写一个包含 9 个以上参数的模板,那么这将无法正常工作,但如有必要,您可以将其扩展到任意数量。


或者,您可以使用decltype 和重载函数:

template <template < typename... > class T, typename... params>
wrapper<T<params...>> wrapper_helper();

template <typename T>
wrapper<T> wrapper_helper();

#define first_va(f,...) f
#define PASTE2(x, y) x##y
#define PASTE(x, y) PASTE2(x,y)
#define createwrapper(...) \
typedef decltype(wrapper_helper< __VA_ARGS__ >()) \
PASTE(first_va(__VA_ARGS__,_blank), _wrapper);

Demo .

关于c++ - 使用专用和非专用类型的模板重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26164454/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com