C++ 模板中的多个类型名参数? (可变参数模板)

2024-05-15

如何在 C++ 模板中拥有多个类型名参数?

#ifndef _CALL_TEMP_H
#define _CALL_TEMP_H

#include <string>
#include <iostream>

template <typename Sig>
class Foo;

template <typename A, typename B>
class Foo
{
    public:
        void output() {
            std::cout << a_ << b_ << std::endl;
        }
        A a_;
        B b_;
};

template <typename A, typename B, typename C>
class Foo
{
    public:
        void output() {
            std::cout << a_ << b_ << c_ << std::endl;
        }
        A a_;
        B b_;
        C c_;
};

#endif

Usage:

int main()
{
    Foo<int ,int> doubleint;
    doubleint.a_ = 1;
    doubleint.b_ = 2;
    doubleint.output();
//  Foo<int , int , std::string> comp;
//  comp.a_ = 1;
//  comp.b_ = 2;
//  comp.c_ = "haha";
//  comp.output();
    return 0;
}

但它不会编译。我怎样才能让它编译?


只需使用可变参数模板声明一个主模板,然后专门针对每个受支持的模板参数数量。例如:

#ifndef CALL_TEMP_H
#define CALL_TEMP_H

#include <iostream>

template <typename...> class Foo;

template <typename A, typename B>
class Foo<A, B>
{
public:
    void output() {
        std::cout << a_ << b_ << '\n';
    }
    A a_;
    B b_;
};

template <typename A, typename B, typename C>
class Foo<A, B, C>
{
public:
    void output() {
        std::cout << a_ << b_ << c_ << '\n';
    }
    A a_;
    B b_;
    C c_;
};

#endif

如果您无法使用 C++11,并且想要保留类似的表示法,则需要使用模板默认参数来模拟可变参数列表。这将隐式限制模板参数的数量,但由于您无论如何都在专门化模板,因此这种限制并不重要。

如果可以接受使用不同的符号,您还可以使用看起来像函数声明的东西来实例化和专门化您的模板:

template <typename> class Foo;

template <typename A, typename B>
class Foo<void(A, B)> {
    ...
};
template <typename A, typename B, typename C>
class Foo<void(A, B, C)> {
    ...
};
...
Foo<void(int, int)>                   f2;
Foo<void(int, int, std::string)> f3;

表示法的更改是否可接受取决于您对类模板的使用。但是,如果没有 C++11,您将无法获得像使用可变参数模板那样的理想解决方案。

BTW, 不要过度使用std::endl http://kuhllib.com/2012/01/14/stop-excessive-use-of-stdendl/: use '\n'表示行尾。如果您确实想刷新流,请使用std::flush. Also _CALL_TEMP_H是标准 C++ 库保留的名称,所有名称均以下划线开头,后跟大写字符:do not在您自己的代码中使用这些名称,除非有明确的使用权限(例如__FILE__ and __LINE__保留,但已授予使用它们的明确许可)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 模板中的多个类型名参数? (可变参数模板) 的相关文章

随机推荐