2016-05-17 92 views
3

对不起混淆标题。我不知道该怎么说。示例应该自行解释。使用模板的C++成员函数模板

我发现一种叫做typemaps,并用它来我的代码是这样的:

template<typename T> 
struct typemap 
{ 
    static const int INDEX; 
}; 

template<> 
const int typemap<Type1>::INDEX = 1; 
template<> 
const int typemap<Type2>::INDEX = 3; 
template<> 
const int typemap<Type3>::INDEX = 11; 

类型1类型2 &的Type3是stucts和这里一样使用类型。 INDEX编号不能位于结构体内,因为可能存在另一个具有不同编号但具有相同类型对象的类型映射表。因此,typemap适用于向量之类的集合中不同的顺序,因为顺序对我很重要。

接下来的事情是非模板类,它有Type1-3作为属性。我想要做的是将这些属性插入到vector中,这是在std :: function的帮助下完成的。但我需要采用通用的类型映射并将其用作插入向量的索引。

我认为它可能工作的唯一的事情是使用更多的模板。就像下一个代码,但这是不正确的方式,因为我仍然是新的模板,我需要帮助正确地写它,所以函数的主体toVector 开始工作,因为我需要。

class MyClass 
{ 
    Type1 type1_; 
    Type2 type2_; 
    Type3 type3_; 
    .. 

    template<typename T> 
    void toVector(T& typemap) 
    { 
    std::vector<..> vect; 
    vect.resize(..); 
    vect[typemap<Type1>::INDEX] = type1_.someFunction(..); 
    vect[typemap<Type2>::INDEX] = type2_.someFunction(..); 
    } 

}; 

我敢肯定,我使用的模板不对的成员函数,我莫名其妙地需要说T参数也有一些模板参数。对不起,我的英语不是母语。对于“..”也很抱歉,这与我的问题无关,它会混淆代码。

+0

您正在寻找[模板模板参数](http://en.cppreference.com/w/cpp/language/template_parameters#Template_template_parameter)。 – Quentin

+1

当人们摆脱命名常量UPPERCASE的坏习惯时? – Slava

+2

@Slava为什么这是一个坏习惯? – CppChris

回答

2

我们不需要为INDEX添加明确的专门化,而是创建一个可以传递的实际对象类型typemap。首先是一些样板:

template <class T> 
struct tag_type { 
    using type = T; 
}; 

template <class T> 
constexpr tag_type<T> tag{}; 

template <int I> 
using int_ = std::integral_constant<int, I>; 

现在,我们创建了一堆重载的对象index()其采取不同tag_type S和返回不同int_小号:

struct typemap { 
    constexpr int_<3> size() const { return {}; } 

    constexpr int_<1> index(tag_type<Type1>) const { return {}; } 
    constexpr int_<3> index(tag_type<Type2>) const { return {}; } 
    constexpr int_<11> index(tag_type<Type3>) const { return {}; } 
}; 

这是一件好事,你可以通过在功能模板中,只需使用:

template<typename T> 
    ??? toVector(T const& typemap) 
    { 
     std::vector<..> vect; 
     vect.resize(typemap.size()); 

     vect[typemap.index(tag<Type1>)] = ...; 
     vect[typemap.index(tag<Type2>)] = ...; 
     vect[typemap.index(tag<Type3>)] = ...; 
    } 
+0

我并不真正熟悉constexpr,但不应该是' constexpr tag_type tag(){};'?顺便说一句。对于这种解决方案,我会尝试一下,它看起来很有趣,但正如我看到的,我仍然需要学习很多东西,这里使用的一些代码结构对我来说是新的。 – Lukin

+0

@Lukin否 - 额外的括号会在那里表示什么? – Barry

+0

它不会编译没有它,即时在'g ++ -std = C++ 11'不知道这是否是问题,我得到了'错误:模板声明'constexpr const tag_type tag'' – Lukin

2

Barry的答案是一种更好的方式来做你正在尝试的东西o不要,但这里是关于具有模板参数本身采取一个参数模板回答您的具体问题:

template<template<typename> class type_with_one_template_parameter> 
    void toVector() 
    { 
    std::vector<..> vect; 
    vect.resize(..); 
    vect[type_with_one_template_parameter<Type1>::INDEX] = type1_.someFunction(..); 
    vect[type_with_one_template_parameter<Type2>::INDEX] = type2_.someFunction(..); 
    } 

目前还不清楚为什么功能有T& typemap参数在你原来的例子,所以我删除了它。