c++ - 模板模板和部分特化 : a puzzle

标签 c++ templates c++11 template-specialization partial-specialization

考虑以下代码:

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/

相关文章:

c++ - 使用模板编译时计算使用 const 值初始化数组

c++ - 如何使用内部类类型初始化模板类中的静态字段

c++ - 将 mysqlx::Value 转换为带有特殊字符的 std::string

java - 哪种语言介于 C++ 和 Java 之间?

C++ 模板。如何让这段代码更漂亮?

c++ - 方法定义中的变量名称是否必须与 C++ 中的声明名称相同?

c++推导函数指针类型

c++ - 有效地收集/分散任务

c++ - 我可以在这个类中用嵌套类填充模板参数吗?

c++ - C++ 应用程序的仪表控制