我有一个模板结构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/