当前位置: 首页 > 知识库问答 >
问题:

混合模板类型的模板参数包(带有可选参数的STD::函数重新创建)

东方化
2023-03-14
Function<
    void /*Return type*/,
    Arg<false, int> /*Required int parameter*/,
    Arg<true, bool, true> /*Optional bool parameter that defaults to true*/
> func;

我希望维护函数 语法,但似乎只能将typenames放在括号中,而不能将类放在括号中。以下是我当前的代码:

template<bool Optional, typename Type, Type Default>
class Arg;

template<typename Type, Type Default>
class Arg<false, Type, Default> {};

template<typename Type, Type Default>
class Arg<true, Type, Default> {};

问题1:我找不到一种方法来使“default”参数对于false特殊化不是必需的。我尝试了使用默认构造函数的代理类,将第三个参数更改为指针,并指定nullptr(这在语法上并不理想)和对类型的常量引用(这仍然需要用户端的三个参数),但似乎没有任何东西允许在函数 中接受两个参数。

问题2:我找不到正确的语法来获得混合模板参数类型的参数包。我试过了(明显无效的语法)

template<typename RetType, Arg<bool, typename Type, Type>... args>
class Function{};

所有这些间接性实际上来自这样一个事实,即在一个类模板中不能有多个参数包,所以我必须找到创造性的方法来指定可选参数,但我将采取任何我能得到的解决方案,以某种方式在编译时创建这个函数,而不必动态地构造这些函数。

我用的是C++20。

共有1个答案

陶鸿畴
2023-03-14

若要在第一个参数false时使第三个模板参数可选,可以使用带有std::enable_if的默认参数:

template <bool Optional, typename T,
    T Default = std::enable_if_t<!Optional, T>{}>
class Arg;

这样,arg 等效于arg ,而arg 格式错误。

可以使用泛型参数:

template <typename R, typename... Args>
class Function {
    static_assert(std::conjunction_v<is_arg_v<Args>...>);
};
template <typename T>
struct is_arg :std::false_type {};
template <bool Optional, typename T, T Default>
struct is_arg<Arg<Optional, T, Default>> :std::true_type {};
template <typename T>
inline constexpr bool is_arg_v = is_arg<T>::value;
 类似资料:
  • 在C++11之前,类模板和函数模板只能含有固定数量的模板参数。C++11增强了模板功能,允许模板定义中包含0到任意个模板参数,这就是可变参数模板。可变参数模板的加入使得C++11的功能变得更加强大,而由此也带来了许多神奇的用法。 可变参数模板 可变参数模板和普通模板的语义是一样的,只是写法上稍有区别,声明可变参数模板时需要在typename或class后面带上省略号...: template<ty

  • 假设有一个模板函数 接受任意数量的参数。给定最后一个参数始终是 ,我如何实现下面显示的 模板,以便 包含此 的参数? 例如,如果像这样调用,应该是: 我的第一个想法是: 但这不会编译: 问题一: 为什么这不能编译?为什么模板参数演绎失败? 最终,我想出了这个解决方案: 这里,是,即中的最后一种类型。然后,的临时值被传递到,其中。这行得通,但在我看来很难看。 问题二: 我想知道如果没有两个函数和的临

  • 受这个答案的启发,我生成了这段代码,其输出取决于编译器: 如果使用 GCC 11 编译,调用

  • 我目前有一个,但是为了灵活性,我希望能够分配一个lambda表达式,将作为映射中的值返回。 所以我创建了这个模板类: 并像这样使用它: IntelliSense提供了更多信息: 多个操作符“=”匹配这些操作数:function“valueorfunction::operator=(const std::function&other)[with T=std::wstring]”function“va

  • 我正在构建一些输入检查器,需要为整数和/或双精度设置特定的函数(例如,“iPrime”应该只适用于整数)。 如果我使用作为参数,它工作得很好: 但如果我将其用作模板参数(如上所示)http://en.cppreference.com/w/cpp/types/enable_if ) 那么我有以下错误: 我不知道第二个版本出了什么问题。

  • 如果我没有理解错的话,类模板定义了一个函数,所以当我调用时,编译器有可能进行隐式强制转换,但是在函数模板的情况下,此时没有函数定义,所以隐式强制转换不会发生。 但我不明白为什么编译器不能创建函数定义,然后应用隐式强制转换? 错误是: 在函数“int main()”中:    25:24:错误:调用“test2::add(void(&)(int))”没有匹配函数    25:24:注:候选人是: