有没有办法在C ++中将输入类型包装到模板类中?

时间:2019-12-01 22:39:07

标签: c++ templates

长话短说,我已经写了下面的一段代码。此代码片段包括两种类型的模板类。它的名字叫Num。

#include <iostream>

using namespace std;

template <typename N, typename U>
class Num
{
public:
    Num(): num0(3), num1(4.56) 
    {
        cout << "This is number: " << num0 << endl;
        cout << "This is number: " << num1 << endl;
    }
private:
    N num0;
    U num1;
};

int main()
{

    Num<int, double> num();

    return 0;
}

代码工作正常,但由于某些原因,我需要在传递给类实例时包装类型。更清楚一点,而不是:

Num<int, double> num();

我需要这样的东西:

Num<(int, double)> num();

当您输入要作为TYPED_TEST_CASE宏进行测试的类型时,我希望这用于在google typed-test中测试两种类型的类。

2 个答案:

答案 0 :(得分:0)

如果您确实需要此语法

Num<(int, double)> num();

不,我认为不可能。

如果您只需要将几种类型包装在一起,请确保:您可以将std::tuple与特殊化配合使用

template <typename>
class Num;

template <typename N, typename U>
class Num<std::tuple<N, U>>
{
public:
    Num(): num0(3), num1(4.56) 
    {
        cout << "This is number: " << num0 << endl;
        cout << "This is number: " << num1 << endl;
    }
private:
    N num0;
    U num1;
};

// ...

Num<std::tuple<int, double>> num{}; 

或数不胜数的其他类似方式。

答案 1 :(得分:0)

您可以将其作为函数类型传递,例如void (int, double),然后从那里提取类型:

// ...

template<typename T>
struct NumHelper;

template<typename N, typename U>
struct NumHelper<void (N, U)>
{ using type = Num<N, U>; };

template<typename T>
using NumHelperT = typename NumHelperT<T>::type;

// ...

int main()
{
    NumHelperT<void (int, double)> num{};
}

注意:请勿使用Num<int, double> num(),因为它是函数声明。