代码之家  ›  专栏  ›  技术社区  ›  Nicola Bonelli

可变模板

  •  23
  • Nicola Bonelli  · 技术社区  · 16 年前

    8 回复  |  直到 13 年前
        1
  •  33
  •   Community kgiannakakis    7 年前
    1. 在中转发任意多个构造函数参数 工厂方法
    2. 任意的 基类允许放置和删除有用的 .
    3. 通过移动初始化 异构类型对象 通过使用可变模板的构造函数直接将其放入容器中。
    4. 文字运算符 它可以为用户定义的文本(如“10110b”)计算值。

    样本3:

    template<typename... T> struct flexible : T... { flexible(): T()... { } };
    

    样本4:

    struct my_container { template<typename... T> my_container(T&&... t) { } };
    my_container c = { a, b, c };
    

    template<char... digits>
    int operator "" b() { return convert<digits...>::value; }
    

    请参见以下示例代码: here

        2
  •  3
  •   PaperBirdMaster    12 年前

    也许安德烈·亚历山德雷斯库(Andrei Alexandrescu)关于2012年本土活动的演讲会引起您的兴趣:

    Here Here 文件。

        3
  •  2
  •   Konrad Rudolph    16 年前
    • 类型安全 printf
        4
  •  2
  •   1800 INFORMATION    16 年前

    允许像Boost.Function这样的东西获取任意数量的参数

        5
  •  2
  •   Kerido    13 年前

    我刚刚写了一封信 article 介绍如何使用C++0x可变模板实现多个COM接口并保持代码紧凑和优雅。

        6
  •  1
  •   cppist    12 年前

    我已经实现了一个NDArray(N-dimensional array),它使用可变参数计数来设置方法大小。使用可变模板参数比使用可变函数参数更安全,而且我可以仅使用可变模板参数控制编译时传递给此函数的参数计数。

    void setSizes(uintmax_t currentSize) {
        static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");
    
        size_ = currentSize;
        data_ = new NDArrayReferenceType[currentSize];
    }
    
    template <typename... Sizes>
    void setSizes(uintmax_t currentSize, Sizes... sizes) {
        static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");
    
        size_ = currentSize;
        data_ = new NDArrayReferenceType[currentSize];
    
        for (uintmax_t i = 0; i < currentSize; i++) {
            data_[i]->setSizes(sizes...);
        }
    }
    

    我还为我自制的SmartPointer实现了一个通用构造函数包装器。它覆盖了所有原始指针类型的用户定义构造函数。

    template <typename TSmartPointer, typename... Args>
    static inline void initialize(TSmartPointer *smartPointer, Args... args) {
        smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
        smartPointer->__retain();
    }
    

    这段代码似乎没有什么特别之处,这是SmartPointer初始值设定项的一部分,用于说明SmartPointer是否应在获取SmartPointer(RAII)时自动调用指针的构造函数。对于抽象类,它无法调用构造函数。

    因此,如果我有一个类型AbstractObject,它是一个抽象类的SmartPointer,和一个类型ConcreteObject,它是一个构造函数为两个整数的类的SmartPointer,我可以编写以下代码:

    AbstractObject object = ConcreteObject(42, 42);
    

    它类似于C#和Java(但使用RAII),在C++/GCC4.8=)中对我有效

        7
  •  0
  •   S. Weiser    12 年前

        8
  •  0
  •   vitaut    9 年前

    其他答案中提到了类型安全printf,但更一般地说,可变模板可用于实现格式化函数,这些函数根本不需要通过格式说明符传递类型信息。例如 C++ Format library 实现类似于Python的格式化函数 str.format :

    fmt::print("I'd rather be {1} than {0}.", "right", "happy");
    

    除了安全的printf。在C++11中使用可变模板自动捕获参数类型。

    lld 还是臭名昭著 PRIdPTR

    std::printf("Local number: %" PRIdPTR "\n\n", someIntPtr);
    

    你可以简单地使用

    fmt::printf("Local number: %d\n\n", someIntPtr);
    

    免责声明 当前位置我是这个图书馆的作者