c++ - 如何将 "using"关键字用于可变参数模板

标签 c++ c++11 variadic-templates

我有一个可变参数模板类,它可以在构造函数中使用任意数量的变量,还有一个 std::tuple/std::pair。等等。

我想将此包装器用于具有不同返回类型的函数。

例如:

class f1
{
    using output = double;
    output operator() { do_smth };
}
class f2
{
    using output = std::tuple<double,int>;
    output operator() { do_smth };
}



template <typename... Types>
class OutputType
{
    std::tuple<Types...> m_val;
public:
    OutputType(std::tuple<Types...>&& val) : m_val(val) {};
    OutputType(Types&& ... val) : m_val(std::forward<Types>(Types)...) {};
};

现在在第三节课我想这样声明:

template <typename F>
class dummy
{
    using Output = typename OutputType(typename F::Output));
}

我如何声明上面的 using 语句,以便它也对 dummy<f2> 做正确的事情? ?

(即 OutputType<double,int> 而不是 OutputType<std::tuple<double,int>> )

最佳答案

如果我正确理解你的问题(?),你可以将类型特征定义为

template <typename ... Types>
struct oTypes
 { using type = OutputType<Types...>; };

template <typename ... Types>
struct oTypes<std::tuple<Types...>>
 { using type = OutputType<Types...>; };

然后定义dummy如下

template <typename F>
struct dummy
 { using output = typename oTypes<typename F::output>::type; };

下面是一个完整的可编译示例

#include <tuple>
#include <utility>

struct f1
 {
   using output = double;

   output operator() ()
    { return 0.0; }
 };

struct f2
 {
   using output = std::tuple<double,int>;

   output operator() ()
    { return { 1.0, 2 }; }
 };

template <typename ... Types>
class OutputType
 {
   private:
      std::tuple<Types...> m_val;

   public:
      OutputType(std::tuple<Types...>&& val) : m_val(val)
       { }

      OutputType(Types&& ... val) : m_val(std::forward<Types>(val)...)
       { }
 };

template <typename ... Types>
struct oTypes
 { using type = OutputType<Types...>; };

template <typename ... Types>
struct oTypes<std::tuple<Types...>>
 { using type = OutputType<Types...>; };

template <typename F>
struct dummy
 { using output = typename oTypes<typename F::output>::type; };

int main()
 { 
   static_assert( std::is_same<dummy<f1>::output,
                               OutputType<double>>::value, "!");
   static_assert( std::is_same<dummy<f2>::output,
                               OutputType<double, int>>::value, "!!");
 }

关于c++ - 如何将 "using"关键字用于可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44330336/

相关文章:

c++ - 为什么在 `OnWorkerEvent` 中使用 `wxProgressDialog`?

c++ - 一个类中有多个构造函数

c++ - 如何正确返回 unique_ptr 的集合

c++ - 通过来自任意索引的参数包初始化 std::array

c++ - 可变参数模板的继承

c++ - 字符串连接函数的执行时间异常糟糕

c++ - 计算类似于二项式和的条件概率

c++ - C++中的未知变量声明语法

c++ - 主模板中类成员的定义和特化期间的隐式实例化

c++ - 力扣#15 : 3sum -- avoiding duplicate