【问题标题】:Is there a way to wrap input types to a template class in C++?有没有办法将输入类型包装到 C++ 中的模板类?
【发布时间】:2020-03-26 13:50:21
【问题描述】:

长话短说,我写了一段代码,如下所示。这个 sn-p 包括一个两种类型的模板类。它的名字是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 中测试两个类型的类。

【问题讨论】:

  • Isn't Num&lt;(int, double)&gt; num(); 相当于 Num&lt;double&gt; num(); ,这应该会给你的类一个编译器错误。
  • 您可以将其作为函数类型传递,例如void (int, double),然后从那里提取参数类型。

标签: c++ templates


【解决方案1】:

如果你正是需要这种语法

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{}; 

或无数其他类似的方式。

【讨论】:

  • 非常感谢!这正是我正在寻找的东西,因为我的经验不足,我不知道。大声笑:)
【解决方案2】:

您可以将其作为函数类型传递,例如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&lt;int, double&gt; num(),因为它是一个函数声明。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-17
    • 2020-07-31
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-06
    • 2019-11-10
    相关资源
    最近更新 更多