2016-05-17 105 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參數在你原來的例子,所以我刪除了它。