如何解决将一些参数绑定到模板模板参数的更简单的语法
类 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
只接受类型模板参数,并使 A
、B
和 D
也有一个 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
类型并准确返回您想要的模板模板,而不是其他一些替代品。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。