C++:部分专用模板类型参数作为另一个模板类成员类型

标签 c++ templates partial-specialization

我有一个模板结构SFoo,其中包含成员结构SZug:

template <typename tTYPE>
struct SFoo
  {
    struct SZug {};
  };

我有另一个带有类型参数的结构SBar:

template <typename tTYPE>
struct SBar
  { /* stuff */ };

我想使用 SZug 作为类型参数来专门化 SBar,如下所示:

template <typename tTYPE>
struct SBar<typename SFoo<tTYPE>::SZug>
  { /* different stuff */ };

这不会编译 - LLVM 输出:

non-deducible template parameter 'tTYPE'

虽然编译器可以根据需要轻松推断出这一点,但我猜测只是 C++ 规范需要专门涵盖这种情况。

有什么办法可以实现这一点吗?
(注意:我目前正在通过将 SZug 移到 SFoo 之外并使用 using 声明来解决这个问题,但它很难看。)

最佳答案

我不确定我完全理解你想要做什么,但你可以尝试以下操作(它只需要向 SZug 添加特定属性:

template <typename tTYPE>
struct SFoo {
    struct SZug {
        // Add this to be able to obtain SFoo<T> from SFoo<T>::SZug
        using type = tTYPE;
    };
};

然后是一个小模板来检查类型是否为 SFoo<T>::SZug :

template <typename tTYPE, typename Enabler = void>
struct is_SZug: public std::false_type { };

template <typename tTYPE>
struct is_SZug<tTYPE, typename std::enable_if<
  std::is_same<tTYPE, typename SFoo<typename tTYPE::type>::SZug>{}
>::type>: public std::true_type { };

并对 SBar 进行轻微修改如果类型是 SZug 则启用“特化”的模板:

template <typename tTYPE, typename Enabler = void>
struct SBar
  { static void g(); };

template <typename tTYPE>
struct SBar<tTYPE, typename std::enable_if<is_SZug<tTYPE>{}>::type>
  { static void f(); };

稍微检查一下:

void f () {
  SBar<int>::g();
  SBar<SFoo<int>::SZug>::f();
}

注意:您也可以直接设置SFoo<T>作为type SFoo<T>::SZug 中的属性,您只需要更改 std::is_same 的第二个参数一点点。

关于C++:部分专用模板类型参数作为另一个模板类成员类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38651861/

相关文章:

c++ - 具有非类型参数的成员函数的部分特化

c++ - 成员函数的部分特化

c++ - 如何在我的结构中声明一个类?

c++ - 如何调用模板化的 operator()()?

c++ - SSE2 整数溢出检查

c++ - 使用/permissive- 在 Visual C++ 中编译时出现奇怪的模板错误

c++ - std::enable_if 的基本用法存在问题

c++ - 使用指令和部分特化

c++ - 如何修复 visual studio 2012 和 VS community 2015 中的 'Access denied' 错误?

c++ - 是什么让 char * 成为一个字符数组?