作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
考虑以下代码:
template<typename>
struct S { };
template<typename, typename>
struct B;
template <typename R, typename... Args, template<class> class C>
struct B<R(Args...), C<R>> {
void f() { }
};
int main() {
B<void(), S<void>> b;
b.f();
}
编译没有问题。
无论如何,无论何时决定使用 B
,它必须提供两种类型。
我想要实现的是以某种方式默认第二个参数(我知道,部分特化不接受其参数的默认值)并让用户将其类型定义为 B<void()>
而不是 B<void(), S<void>>
.
不幸的是,由于模板模板、部分特化和参数之间存在的依赖性,它们一起导致了一个难题,几个小时以来我一直在努力解决这个难题。
有什么巧妙的解决方案吗?
到目前为止,我已经能够用中间结构解决它,但我不太喜欢它......
最佳答案
部分特化不接受默认参数,但主特化可以。您可以将其添加到此处:
template<typename Sig, typename X = S<return_type_t<Sig>>>
struct B;
然后您需要做的就是为签名实现一个返回类型元函数。像这样的东西:
template <class Sig>
struct return_type;
template <class Sig>
using return_type_t = typename return_type<Sig>::type;
template <class R, class... Args>
struct return_type<R(Args...)> {
using type = R;
};
关于c++ - 模板模板和部分特化 : a puzzle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35922566/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!