2012-11-08 56 views
5

沒有專門爲每個類模板/類,是有可能寫出一個廣義的「重新綁定」元功能,使 給出是否可以編寫一個通用重新綁定模板?

template<class > struct foo; 
struct bar; 

以下

is_same<rebind<foo<int>,float>,foo<float>> 
is_same<rebind<bar>,bar> 

,也許

is_same< rebind<std::vector<int>,float>,std::vector<float>> 

返回一個相當於true的類型?

回答

6

當然。

但請注意,採用可變參數模板參數列表的任何模板模板參數僅限於接受僅包含類型參數的模板,而非非類型參數。換句話說,下面的一般情況將不適用於std::array,因爲它的第二個參數是一個整數。你必須添加一個特例。

主模板已經是一種特殊情況,因爲它處理的不是模板專業化的類。

http://liveworkspace.org/code/5b6f0cb3aec1eb74701e73d8d21aebab

template< typename bound, typename ... new_args > 
struct rebind_class { 
    static_assert(sizeof ...(new_args) == 0, 
     "can't rebind arguments to non-specialization"); 
    typedef bound type; 
}; 

template< template< typename ... > class template_, typename ... new_args, 
    typename ... old_args > 
struct rebind_class< template_< old_args ... >, new_args ... > { 
    typedef template_< new_args ... > type; 
}; 

template< typename ... args > 
using rebind = typename rebind_class< args ... >::type; 
+0

先生,先生。這太棒了! –

+1

啊...沒有堅實的動力,這感覺就像一個黑客。請不要使用這種類型的東西,除了解決某個庫的不合作界面。 – Potatoswatter

+0

正是我所期待的!感謝您。我有一堆迭代器,它將序列類型作爲第一個參數,如果參數是const限定的,則會生成一個const迭代器。任務是從可變的一個獲得一個const迭代器,反之亦然。從而修改了代碼甚至使mpl像佔位符例如rebind 那樣小,使用>使foo 。值參數對我來說並不是問題,因爲我總是更喜歡使用數組>來覆蓋std :: array – abir

相關問題