C++ 混淆部分模板专门化
我看到了这段代码,它让我很困惑:C++ 混淆部分模板专门化,c++,templates,boost,typetraits,C++,Templates,Boost,Typetraits,我看到了这段代码,它让我很困惑: #include <boost/static_assert.hpp> #include <boost/type_traits.hpp> #include <boost/utility/enable_if.hpp> template<class TT, typename Enable = void> struct UU { BOOST_STATIC_ASSERT_MSG(sizeof(TT) == 0, "unde
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
template<class TT, typename Enable = void> struct UU { BOOST_STATIC_ASSERT_MSG(sizeof(TT) == 0, "undefined UU"); };
template<class TT>
struct UU<
TT,
typename boost::enable_if_c<
!boost::is_same<
TT,
typename boost::remove_cv<
typename boost::decay<TT>::type
>::type
>::value
|| boost::is_pointer<TT>::value
>::type
>
: UU<
typename boost::remove_cv<
typename boost::decay<
typename boost::remove_pointer<TT>::type
>::type
>::type
>
{};
#包括
#包括
#包括
模板结构UU{BOOST_STATIC_ASSERT_MSG(sizeof(TT)==0,“未定义的UU”);};
模板
结构UU<
TT,
typename boost::启用\u if\u c<
!boost::是一样的吗<
TT,
typename boost::删除<
typename boost::decay::type
>::类型
>::价值
||boost::is_指针::值
>::类型
>
:UU<
typename boost::删除<
类型名boost::decay<
typename boost::删除\指针::类型
>::类型
>::类型
>
{};
我知道我只能问一个问题,但我不知道如何用一个问题来表达我的困惑,所以我提前道歉
我已经读过了,但是enable_if_c的模板参数令人困惑。这是否意味着如果TT与衰减的TT不同,或者如果TT是指针,则存在部分模板专门化
其次,结构从自身继承意味着什么?在这种情况下,UU是从UU(自身)继承的吗?这是某种递归模板吗
(代码编译时没有错误。)它继承自UU,但实例化不同(例如,如果传递的类型是int*const*,即使删除了第一级指针和cv,它仍然是指针)。但是,它确实确保没有传递void**(因为void参数最终会触发带有静态断言的主窗体)。它继承自UU,但实例化是不同的(例如,如果传递的类型是int*const*,即使移除了第一级指针和cv,它仍然是指针). 但是,它确实确保void**未被传递(因为void参数最终将触发带有静态断言的主窗体) 这是否意味着如果TT与衰减的TT不同,或者如果TT是指针,则存在部分模板专门化 没错。否则将出现替换失败,主模板将用于传入的类型参数
TT
其次,结构从自身继承意味着什么?在这种情况下,UU是从UU(自身)继承的吗?这是某种递归模板吗
它不是从自身继承,而是从类模板的另一个实例化继承。它不是真正的递归,因为其他实例化是通过向其中传递另一个修改过的类型创建的。尽管如果将模板看作是在类型上操作的元函数,那么这确实是递归调用。与函数式编程非常相似
其思想是将复合类型简化为由其组成的类型。因此,引用类型的引用、数组元素类型的数组和指针对象类型的指针。继承允许该过程继续,直到我们手中没有复合类型为止
最终,主模板检查简化类型的正确性(在本例中,大小为非零)
这是否意味着如果TT与衰减的TT不同,或者如果TT是指针,则存在部分模板专门化
没错。否则将出现替换失败,主模板将用于传入的类型参数TT
其次,结构从自身继承意味着什么?在这种情况下,UU是从UU(自身)继承的吗?这是某种递归模板吗
它不是从自身继承,而是从类模板的另一个实例化继承。它不是真正的递归,因为其他实例化是通过向其中传递另一个修改过的类型创建的。尽管如果将模板看作是在类型上操作的元函数,那么这确实是递归调用。与函数式编程非常相似
其思想是将复合类型简化为由其组成的类型。因此,引用类型的引用、数组元素类型的数组和指针对象类型的指针。继承允许该过程继续,直到我们手中没有复合类型为止
最终,主模板检查简化类型的正确性(在本例中,大小为非零)。我想我现在明白了。下面是一个模拟示例:
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
#include <typeinfo>
#include <iostream>
template<class TT, typename Enable = void> struct UU { BOOST_STATIC_ASSERT_MSG(sizeof(TT) == 0, "undefined UU"); };
template<class TT>
struct UU<
TT,
typename boost::enable_if_c<
!boost::is_same<
TT,
typename boost::remove_cv<
typename boost::decay<TT>::type
>::type
>::value
|| boost::is_pointer<TT>::value
>::type
>
: UU<
typename boost::remove_cv<
typename boost::decay<
typename boost::remove_pointer<TT>::type
>::type
>::type
>
{
UU()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
struct dummy
{
dummy()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<>
struct UU<dummy>
{
UU()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main()
{
typedef dummy**& mytype;
std::cout << typeid(typename boost::remove_cv<typename boost::decay<mytype>::type>::type).name() << std::endl;
std::cout << boost::is_pointer<mytype>::value << std::endl;
std::cout << boost::is_same<mytype, typename boost::remove_cv<typename boost::decay<mytype>::type>::type>::value << std::endl;
UU<mytype> uu;
return 0;
}
#包括
#包括
#包括
#包括
#包括
模板结构UU{BOOST_STATIC_ASSERT_MSG(sizeof(TT)==0,“未定义的UU”);};
模板
结构UU<
TT,
typename boost::启用\u if\u c<
!boost::是一样的吗<
TT,
typename boost::删除<
typename boost::decay::type
>::类型
>::价值
||boost::is_指针::值
>::类型
>
:UU<
typename boost::删除<
类型名boost::decay<
typename boost::删除\指针::类型
>::类型
>::类型
>
{
UU()
{
我想我现在明白了。这是一个模拟示例:
#include <boost/static_assert.hpp>
#include <boost/type_traits.hpp>
#include <boost/utility/enable_if.hpp>
#include <typeinfo>
#include <iostream>
template<class TT, typename Enable = void> struct UU { BOOST_STATIC_ASSERT_MSG(sizeof(TT) == 0, "undefined UU"); };
template<class TT>
struct UU<
TT,
typename boost::enable_if_c<
!boost::is_same<
TT,
typename boost::remove_cv<
typename boost::decay<TT>::type
>::type
>::value
|| boost::is_pointer<TT>::value
>::type
>
: UU<
typename boost::remove_cv<
typename boost::decay<
typename boost::remove_pointer<TT>::type
>::type
>::type
>
{
UU()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
struct dummy
{
dummy()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template<>
struct UU<dummy>
{
UU()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main()
{
typedef dummy**& mytype;
std::cout << typeid(typename boost::remove_cv<typename boost::decay<mytype>::type>::type).name() << std::endl;
std::cout << boost::is_pointer<mytype>::value << std::endl;
std::cout << boost::is_same<mytype, typename boost::remove_cv<typename boost::decay<mytype>::type>::type>::value << std::endl;
UU<mytype> uu;
return 0;
}
#包括
#包括
#包括
#包括
#包括
模板结构UU{BOOST_STATIC_ASSERT_MSG(sizeof(TT)==0,“未定义的UU”);};
模板
结构UU<
TT,
typename boost::启用\u if\u c<
!boost::是吗<
TT,
typename boost::删除<
typename boost::decay::type
>::类型
>::价值
||boost::is_指针::值
>::类型
>
:UU<
typename boost::删除<
me@ub16:~/tmp/traits$ g++ -I~/me/bin/boost_1_60_0 c.cpp && ./a.out
In file included from c.cpp:1:0:
c.cpp: In instantiation of ‘struct UU<dummy, void>’:
c.cpp:10:8: recursively required from ‘struct UU<dummy**, void>’
c.cpp:10:8: required from ‘struct UU<dummy**&>’
c.cpp:62:13: required from here
c.cpp:7:56: error: invalid application of ‘sizeof’ to incomplete type ‘boost::STATIC_ASSERTION_FAILURE<false>’
template<class TT, typename Enable = void> struct UU { BOOST_STATIC_ASSERT_MSG(sizeof(TT) == 0, "undefined UU"); };