我有一个可变参数模板类,它可以在构造函数中使用任意数量的变量,还有一个 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/