c++ - 如何检查模板模板类的接口(interface)

标签 c++ c++11 templates c++14 template-templates

我试图根据模板模板参数是否定义了类型 type 来使用 SFINAE 重载模板类(例如 std::remove_reference 有一个type 成员类型别名),但我想不出这样做的好方法。

比如我想做的

template <template <typename...> class Trait>
using EnableIfHasTypeMember = std::void_t<Trait::type>;

template <template <typename...> class Trait, typename OtherStuff,
          EnableIfHasTypeMember<Trait>* = nullptr>
class Something { ... }

但这给了我一个编译器错误。有什么方法可以检查模板模板参数的接口(interface)吗?

最佳答案

如果我正确理解了您的需求,那么您在示例中展示的一般性水平是不可能的。除非您知道模板实例化时使用的参数,否则您无法知道模板是否具有类型成员类型别名,因为它可能因特化而异。示例:

template <typename T>
struct my_trait
{
    using type = int;
};

template <>
struct my_trait<double> {};

您期望如何 EnableIfHasTypeMember在这种情况下表现如何?这就是为什么在实例化之前无法推断模板的内容。

在这种情况下,记住 my_trait<T> 的所有实例化会有所帮助对于不同类型 T 是彼此不同的类型。类型之间没有实际关系;它们起源于一个通用模板,该模板允许编写可重用的通用实现,但具体类型一旦实例化就完全独立。

关于c++ - 如何检查模板模板类的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42814011/

相关文章:

c++ - 使用 Boost 作为 CMake 的 git 子模块

c++ - 尝试使用两个单独的 getline() 实例来填充两个单独的 vector

c++ - 在 C++ 中,是否可以获取函数的返回类型以便在不调用该函数的情况下声明一个变量?

c++ - 在 C++ 中使用 std::Vector 进行多线程

c++ - 查询特定变量的对齐方式

html - Golang 模板中的嵌套范围

c++ - 在 C/C++ 中创建对象时编译器优化的边界是什么

c++ - fun(...) 和 (*fun)(...) 在 C/C++ 中使用函数指针有什么区别

C++ 重载 [] 使用模板访问子 vector

java - JSP 技巧让模板制作变得更容易?