考虑以下课程:
template<class T, int...> struct MyClass1 {};
template<class T, unsigned int...> struct MyClass2 {};
template<class T, long long int...> struct MyClass3 {};
template<class T, unsigned long long int...> struct MyClass4 {};
我无法修改这些类。
是否可以编写一个辅助类或函数,它将返回可变参数列表的类型:
something<MyClass1>::type (-> int)
something<MyClass2>::type (-> unsigned int)
something<MyClass3>::type (-> long long int)
something<MyClass4>::type (-> unsigned long long int)
和size_t
如果可变参数列表为空?
答案 0 :(得分:0)
我无法想出一种定义一个通用元函数的方法,但是这里有一个可能的解决方法:
#include <iostream>
#include <type_traits>
using namespace std;
// PRIMARY TEMPLATE
template<typename T>
class something
{
};
// SPECIALIZATIONS FOR int
template<typename T, int... U, template<typename, int...> class L>
class something<L<T, U...>>
{
public:
typedef int type;
};
template<typename T, template<typename, int...> class L>
class something<L<T>>
{
public:
typedef size_t type;
};
// SPECIALIZATIONS FOR unsigned int
template<typename T, unsigned int... U, template<typename, unsigned int...> class L>
class something<L<T, U...>>
{
public:
typedef unsigned int type;
};
template<typename T, template<typename, unsigned int...> class L>
class something<L<T>>
{
public:
typedef size_t type;
};
/* ... OTHER SPECIALIZATIONS ... */
struct A {};
struct B {};
int main()
{
static_assert(is_same<something<MyClass1<A, 1, 2>>::type, int>::value, "Error!");
static_assert(is_same<something<MyClass1<A>>::type, size_t>::value, "Error!");
static_assert(is_same<something<MyClass2<B, 1U, 2U, 3U>>::type, unsigned int>::value, "Error!");
static_assert(is_same<something<MyClass2<B>>::type, size_t>::value, "Error!");
return 0;
}
我试图只编写涵盖所有情况的单一专业化,例如:
template<typename U, typename T, U... V, template<typename, U...> class L>
class something<L<T, V...>>
{
public:
typedef U type;
};
但Clang 3.2抱怨U的类型无法推断,因此永远不会使用get_type
的这种专业化。因此,如果您遵循此方法,则必须明确定义每个专业化。根据您的使用情况,这可能是也可能不可接受。希望它有所帮助。