将一些参数绑定到模板模板参数的更简单的语法

问题描述

ExpectTTs 接受多个模板模板参数:

template< template<typename> class... TT >
struct ExpectTTs {};

另一种类型需要两个模板参数。我需要修复一个并将其余的传递给 ExpectTTs

目前我正在使用这个解决方案:

template< typename T >
struct TwoTs {
    template< typename U >
    struct Inner {};
};

ExpectTTs< TwoTs<int>::Inner >

是否可以更改某些内容,以便我可以将一个简单的模板实例(例如 TwoTs<int>)传递给 ExpectTTs

在我的代码库中的几个点中,我有ExpectTTs< A,B,C<int>::Inner,D,E<int,int>::Inner,F<void>::Inner > 这样的表达式,似乎没有必要很难读和写。

任何 C++ 版本都可以。

解决方法

如果您有一个带有两个参数的模板,则不能只指定一个并获取模板模板。那根本不可能。您也不能创建模板模板别名,因为您可以使用 using 创建模板别名。 C++ 并没有让模板模板的工作变得容易,你基本上只能在完全实例化它们或者将它们作为参数传递给模板时使用它们。

您也无法让 ExpectTTs 真正同时使用模板模板参数和类型模板参数,因为 C++ 严格区分它们(否则您可以执行诸如 let ExpectTTs 提取内部类型之类的操作)。 也许您可以让 ExpectTTs 只接受类型模板参数,并使 ABD 也有一个 Inner template 而它们本身是类型,因此您可以让 ExpectTTs 始终执行提取 Inner 的工作。但是当然,您将无法直接传递像 std::optional 这样的 STL 模板。

你可以(在我看来)改进你的设计的一件小事是使用这样的东西:

#include <utility>  // For the example
#include <optional>

template<template<class> class...>
struct ExpectTTs {};

template<template<class...> class TT,class T>
struct bind {
    template<class U>
    using bound_t = TT<T,U>;
};

ExpectTTs<std::optional,bind<std::pair,int>::bound_t> e{};

它可能更冗长,但它不需要侵入性的 Inner 类型并准确返回您想要的模板模板,而不是其他一些替代品。