如何从类构造函数传递模板参数

阿列克谢·奇切林(Alexey Chicherin)

我有模板类和一些使用它的策略。它只是执行具有特定策略的lambda。

template<template<class>class Policy, typename ReturnType>
class execute :Policy<ReturnType>
{
public:
    ReturnType res;
    execute(ReturnType(*func)())
    {res = Policy<ReturnType>().launch(func);}
};

template<typename ReturnType>
struct Policy1 {
    ReturnType launch(ReturnType(*func)())
    {/*some code*/
    return func();}
};

template<typename ReturnType>
struct Policy2 {
    ReturnType launch(ReturnType(*func)())
    {/*some code*/
     return func();}
};

int main()
{
    auto lambda_int = [] {return int(1); };
    auto lambda_float = [] {return float(1.0); };

    execute<Policy1, decltype(lambda_int())> exec1(lambda_int);
    execute<Policy2, decltype(lambda_float())> exec2(lambda_float);
}

客户端代码完全可以满足我的需求。但是我两次指向lambda,我想将客户端代码中的类变量声明减少为:

execute<Policy1> exec3(lambda_float);     

据我了解,我不能使用类似的东西,tempalte<auto ReturnType>因为它仅适用于单个参数。我也不能使用默认参数,因为我想传递任何类型的lambda返回。

template<template<class>class Policy, typename ReturnType=int>
class execute :Policy<ReturnType>

问题是如何将函数返回类型(即构造函数args)传递给类模板参数?还是可能有另一种方式?

谢尔盖

我不知道您的示例代码与实际代码有多少差异,但是如果我以它的面值来考虑,我将对其进行重组。

我首先看到的是,您Policy不必是模板类。它没有任何需要类级模板的成员。相反,该launch函数可以成为模板:

struct Policy {
    template <class Callable>
    auto launch(Callable&& callable) {
     /*some code*/
     return callable();
    }
};

现在,您没有理由execute要继承Policy(对于策略类型设计这也是惯用的)。

我们仍然无法解决您的lambda类型扣除问题。理想情况下,我们将使用类模板参数推导,并且可以!考虑到上述所有内容,以下是我将如何更改您的内容execute

template<class Policy, class Callable>
struct execute {
    using ResultType = std::invoke_result_t<Callable>;
   
    execute(Policy&&, Callable&& callable)
    {
         res = Policy().launch(std::forward<Callable>(callable));
    }

    ResultType res;
};

您将可以像这样使用它:

void foo()
{
    execute exec{Policy{}, [](){ return 10; }};
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何通过构造函数传递模板参数?

从传递给构造函数的类作为模板参数继承

将对象传递给函数时,如何防止模板化构造函数将类作为参数

构造函数接受参数时如何实例化模板类

如何将参数传递给静态类构造函数?

将参数从模板传递给构造函数

如何通过引用模板类的成员函数传递参数?

如何将函数指针作为类模板参数传递?

继承的类模板的参数化构造函数

带有构造函数参数的模板类

专门针对模板化模板参数的模板类构造函数

Typescript传递枚举类构造函数参数

将参数传递给类构造函数

如何声明模板化函数,以便可以在类构造函数/函数中传递

C++ 在模板的参数中传递模板的构造函数值

在自己的成员函数中构造类时,如何强制类模板参数推导?

非模板类的构造函数中的模板参数

定义类模板构造函数并提供模板参数

如何模板化类构造函数

以模板化类作为参数的可变类构造函数

如何避免继承的类必须传递基类的构造函数参数

将带有可选模板类型参数的函数传递给类构造函数,并将其分配给方法

如何使用new传递构造函数参数

将类类型作为参数传递给类构造函数

如何在C ++中使用通用引用参数为模板类编写构造函数

将数组作为类构造函数的函数参数传递

将抽象类构造函数作为函数参数传递

获取模板的形式参数传递的类型的构造函数

c ++模板类根据类型通过ref传递构造函数