首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用pre-c ++ 0x(VS2008)实现"Variadic Template"?

在 Visual Studio 2008 中,C++ 0x 标准并未完全支持 Variadic Template。但是,您可以使用 Boost.Preprocessor 库来实现类似的功能。以下是一个简单的示例,展示了如何使用 Boost.Preprocessor 库实现可变参数模板。

首先,确保您已经安装了 Boost 库。然后,按照以下步骤操作:

  1. 包含 Boost.Preprocessor 头文件:
代码语言:cpp
复制
#include<boost/preprocessor/repetition/enum_params.hpp>
#include<boost/preprocessor/repetition/enum_binary_params.hpp>
#include<boost/preprocessor/repetition/repeat.hpp>
#include<boost/preprocessor/arithmetic/add.hpp>
#include<boost/preprocessor/punctuation/comma_if.hpp>
  1. 定义一个可变参数模板:
代码语言:cpp
复制
template<typename... Args>
struct VariadicTemplate;
  1. 使用 Boost.Preprocessor 宏来生成可变参数模板的实现:
代码语言:cpp
复制
#define MAX_ARGS 10

#define VARIADIC_TEMPLATE_IMPL(z, n, unused) \
    template<BOOST_PP_ENUM_PARAMS(n, typename T)> \
    struct VariadicTemplate<BOOST_PP_ENUM_PARAMS(n, T)> \
    { \
        static constexpr int size = n; \
        void print() const \
        { \
            BOOST_PP_REPEAT(n, PRINT_TYPE, T) \
        } \
    };

#define PRINT_TYPE(z, n, data) \
    BOOST_PP_COMMA_IF(n) std::cout<< typeid(data ## n).name()

BOOST_PP_REPEAT(MAX_ARGS, VARIADIC_TEMPLATE_IMPL, ~)

#undef VARIADIC_TEMPLATE_IMPL
#undef PRINT_TYPE

现在,您可以使用 VariadicTemplate 来处理最多 MAX_ARGS 个参数。例如:

代码语言:cpp
复制
int main()
{
    VariadicTemplate<int, float, double> vt;
    vt.print(); // 输出类型名称
    return 0;
}

请注意,这种方法的局限性在于最大参数数量受 MAX_ARGS 的限制。在 Visual Studio 2008 中,您可能需要根据实际需求调整 MAX_ARGS 的值。

如果您需要更高级的 Variadic Template 功能,建议升级到支持 C++11 或更高版本的 Visual Studio。这将允许您使用标准库中的现代 C++ 功能,例如 std::tuplestd::variant

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 现代C++实现多种print

    Print Version1 幸运的是,有更好的解决方案,那就是使用C++11引入的variadic template,先来看看第一个版本的print,并介绍variadic template,代码如下...Template: 是指数量不定,类型不定的模板,如上所示的print函数,可以看到接受了不同类型的参数,调用的函数就是拥有Variadic Template的函数,print(7.5, "hello....}; Print Version4 知道上面的initializer_list的解包方式, 还可以只使用一行实现print: template <typename ......print函数了, 除了tuple容器以外, 其他容器的重载操作符与上述类似, 有些许差异. tuple容器的print tuple是C++11提出来的, 内部实现使用的是variadic template...下面给出tuple一种基于递归继承的简洁实现: template <typename ...

    77740

    TypeScript 4.3 新功能的实践应用

    看一下 TS 4.0 以来的三条更新记录: 4.0 版本新增 Variadic Tuple Types 4.1 版本新增 Template Literal Types 4.3 版本完善 Template...第二步:Template Literal Types 搭配 Variadic Tuple Types 显奇效 这一步不要求你能全部看懂,先有个大致的概念和感觉,先让你知道,Template Literal...解决方案拆解的第一步已经指出核心技术支撑是 Variadic Tuple Types 和 Template Literal Types。...具体到 JoinTupleToTemplateStringType 的实现,除了条件类型和 infer 的使用,我们还使用了一个威力巨大的 TS 泛型特性:递归。...但在 TS 泛型层面,我们只能使用递归和条件来实现一些有趣的泛型函数。下面的代码我加了详细的注释,顺着慢慢看,别害怕,就一定能看懂。

    1.1K30

    【译】golang 可变参数函数终极指南

    使用常用模式学习关于go语言可变参数函数的一切 Ultimate Guide to Go Variadic Functions 原文地址 https://blog.learngoprogramming.com...Println 函数,就会明白它是如何使自己变得易于使用的。 它使用可变参数函数接受可选的输入参数数目。...如何传递一个切片? 通过将可变参数运算符... 加在现有切片后,可以将其传递给可变参数运算符。...在使用空接口之前要仔细考虑,依靠显式类型和接口来实现所需的行为。 将切片传递给具有空接口的可变参数 你不能将一个普通的切片传递给一个具有空接口类型的可变参数。具体原因请阅读这里。.../parse: https://golang.org/src/text/template/parse/parse.go?

    3.3K30

    C++ 动态新闻推送 第1期

    herb发了trip report 关于c++标准会的最新进展 c++23 herb介绍了几个他感兴趣的小补丁 lambda可以省略括号(),但是如果有mutable又不可以省略括号了,需要修订 range使用...std::to_underlying代替 std::underlying_type_t 涉及到语法细节我也不懂,可以看trip report中引用的论文看详细细节 c++20 运行时拿到函数名,使用...copy_if c++17已经实现了一些并行算法,实现比较粗暴 std::sort(std::execution::par, ...); std::for_each(std::execution::par...介绍variadic aggregate initialization的 数组初始化可以变参模版初始化,这个例子太魔鬼了,可以看这个博客 理解一下 视频 cpp weekly 老生常谈,讲的 C++’s...C++20 changes the way we write code - Meeting C++ 2020 介绍c++20的四个概念coroutine/concept/module/range,以及如何改善

    51010

    CC++开发基础——可变参数与可变参数模板

    2.如果可变参数的参数类型不同,可以使用可变参数模板。 C语言中,在定义可变参数函数时,使用省略号"..."表示参数是可变的。...2.可变参数相关的宏定义 在C语言中,一般需要借助相关的宏定义来实现可变参数,常见的宏定义如下: va_arg:每一次调用va_arg会获取当前的参数,并自动更新指向下一个可变参数。...可以使用sizeof...运算符获取参数包中具体的参数数量。 样例如下: //Args是一个模板参数包;args是一个函数参数包 template <typename......1, 2, A, 四,参考阅读 《C++17入门经典》 《C++ primer》 《深入理解C++11》 https://www.sandordargo.com/blog/2023/05/03/variadic-functions-vs-variadic-templates...lf-va-arg-va-copy-va-end-va-start-access-function-arguments https://www.sandordargo.com/blog/2023/05/03/variadic-functions-vs-variadic-templates

    58050

    如何优雅的使用 std::variant 与 std::optional

    的Vistor实现来看一下具体的Vistor使用例子. ponder中的Vistor主要有三个, ConvertVisitor, LessThanVisitor,以及EqualVisitor, 分别完成...template实现, 我们在std::visit调用的时候传入多个参数即可完成双操作数的visit, 同时我们也可以正确的获取std::visit调用的返回值. 3.1.1 ConvertVisitor...与operator<()的实现基本类似. 3.2. overloads方式访问std::variant 除了上述介绍的方法, 有没有更优雅的使用std::visit的方式呢?....>; 简单的两行代码, 我们的std::visit()达到了类似派发的效果, 那么这两行代码是如何实现相关的功能的呢? 这就是参考链接1中主要介绍的内容....using其实早在C++11的时候就加入到标准了, 但variadic template参数展开支持using表达式, 是17才支持的特性, 像如下代码声明: using Ts::operator(

    3.5K10

    C++那些事之SFINAE

    解决方案包括将序列化功能分为两个不同的功能:一个仅使用obj.serialize(),另一个根据obj的类型使用to_string。 我们回到一个已经解决的较早的问题,如何根据类型拆分?...将hasSerialize测试与其使用序列化分开是比较干净的。 这个问题如何解决呢? 第一种解决方案:加上constexpr,具体后面阐述。...这个标准不仅可以减轻TMP的麻烦(模板元编程的副作用),而且在第一个十年就可以使用,因此它的代码名为c++ 0x。...在这种情况下,将可以使用std :: void_t C ++ 17帮助程序。无论如何,这是您可以使用的要点!...5.2 重建is_valid 现在,我们已经有了一种非常时尚的方式,可以使用lambda生成具有潜在SFINAE属性的未命名类型,我们需要弄清楚如何使用它们!

    2.2K20

    现代C++之SFINAE

    解决方案包括将序列化功能分为两个不同的功能:一个仅使用obj.serialize(),另一个根据obj的类型使用to_string。 我们回到一个已经解决的较早的问题,如何根据类型拆分?...将hasSerialize测试与其使用序列化分开是比较干净的。 这个问题如何解决呢? 第一种解决方案:加上constexpr,具体后面阐述。...这个标准不仅可以减轻TMP的麻烦(模板元编程的副作用),而且在第一个十年就可以使用,因此它的代码名为c++ 0x。...在这种情况下,将可以使用std :: void_t C ++ 17帮助程序。无论如何,这是您可以使用的要点!...5.2 重建is_valid 现在,我们已经有了一种非常时尚的方式,可以使用lambda生成具有潜在SFINAE属性的未命名类型,我们需要弄清楚如何使用它们!

    2.9K20

    【笔记】C++2.0新特性

    (args)来获取所需包的参数个数 Variadic Templates的拆分形式和普通形式相比, 拆分形式更加特化, 所以对于下面的两个函数调用中, 拆分形式优先级更高, 普通形式永远不会被调用: /...Types> void Foo(const T& arg0, const Types&... args); std::tuple就是借助Variadic Templates实现的, tuple的模板参数是不断递归进行了继承从而初始化的...可以方便其它算法有限使用 新版本的STL容器全部实现了initializer_list的接口, 因此可以自动接受任意个数的初始化参数了....delete, default, noexcept, override, final 函数后面加上=default然后不给出实现, 可以令编译器强制生成一个默认的对应函数, 但是不要对普通函数使用,...: // forward _Arg as movable // 使用万能引用作为参数来接受任何类型的输入 // 然后区别在返回值, 无论此时输入的类型是什么, 都去除引用后添上右值引用符并返回 // 这样就实现了将任何类型的输入都强制转为右值返回的效果

    90220

    C++17 fold expression

    1.简介 C++11增加了一个新特性变参模板(variadic template),它可以接受任意个模版参数,参数包不能直接展开,需要通过一些特殊的方法,比如函数参数包的展开可以使用递归方式或者逗号表达式...,在使用的时候有点难度。...= = && || , .* ->* 3.使用实例 (1)一元右折叠 从表达式右边开始fold,看它是left fold还是right fold我们可以根据参数包…所在的位置来判断,当参数包.... - 1); } auto t = sub_one_left(2,3,4);// (((1-2)-3)-4) = -8 (5)comma fold 在C++17之前,我们经常使用逗号表达式结合列表初始化的方式对参数包进行展开...当然,我们也可以通过binary fold实现template void printer(Args&&... args) { (std::cout <<

    1.8K30

    C++ 动态新闻推送 第25期

    投入llvm的开发越来越多,针对功能实现的抉择也就多了起来,好事 C++ exceptions under the hood 介绍异常的方方面面,值得了解一下 (或者永远不用异常) How Template...Template Parameters Can Simplify Template Classes 介绍了一个复杂的例子,如何用模板模板参数来改善CRTP复杂性 Variadic Templates...or the Power of Three Dots 2021了不会还有人不知道变参模板吧 #include using namespace std::literals; template...)] { ... }; } 直接报错,所以要有支持move的f,any_invocable诞生,以前叫move_function/ function_ref改成这个了 这里有个实现...可以了解一下设计,主要灵感来自这篇论文, backtrace-labs 是一个帮忙定位问题收集信息的公司 tilck A Tiny Linux-Compatible Kernel 可以学一下如何自己做个小

    50520
    领券