2014-07-23 76 views
3

我目前對固定大小參數包C++語言功能提案(n4072)的進展感到好奇。此功能允許以下語法爲有效C++語法:固定大小參數包的狀態

void Foo(int...[10] iList); 

這將允許使用各種有用的模板元編程功能。我的主要原因是因爲我創建了一個圖書館類,它代表了一個任意級別的數學張量對象。

這將允許我做索引類時,以下幾點:

template <typename T, std::size_t... Sizes> 
class CTensor { 
     // ... 
public: 
    NumType& operator()(std::size_t...[sizeof...(Sizes)] coords) 
    { 
      // Return reference to element at the position specified 
      // by coords. 
    } 
}; 

,並調用它以下列方式:

CTensor<int, 3, 4, 5> tensor; 
/* tensor(1, 2, 3, 4) = 5; // Results in a descriptive compile-time error */ 
tensor(1, 2, 3) = 5; // Sets the element at (1, 2, 3) to 5. 

據我所知是沒有辦法來實現這一標準的C++ 11,所以我對這個提議非常感興趣,但我找不到任何有關工作組接受或拒絕的信息;誰能提供更多信息?

+1

查看此拉珀斯維爾旅行報告(http://botondballo.wordpress.com/2014/07/17/trip-report-c-standards-committee-meeting-in-rapperswil-june-2014/)。無論如何,在C++中可能會有一個靜態斷言,即大小相同,或者如果它們不相等,則可以將它們排除。 – chris

+1

對此,並沒有真正的迫切性。你已經可以編寫你想要的代碼了,它只是更加詳細一點。 –

+0

另外,使用概念精簡版,您所需要的代碼更容易編寫。這也使得指定'... [X]'的含義變得容易得多,因爲這樣他們就可以依靠概念。 – Yakk

回答

5

你所要求的可以在標準C++中實現。一旦概念進入語言就會變得更容易。

這裏是在標準C的實現++:

template<std::size_t N, class...Ts> 
constexpr bool exactly_N_types() { 
    return sizeof...(Ts) == N; 
} 
template<bool b,class T=void> 
using enable_if_t = typename std::enable_if<b,T>::type; 
template<class T0> 
constexpr bool can_all_convert_to { return true; } 

template<class T0, class T1, class...Ts> 
constexpr bool can_all_convert_to() { 
    return std::is_convertible< T1, T0 >::value && can_all_convert_to<T0, Ts...>(); 
} 

template <typename T, std::size_t... Sizes> 
struct CTensor { 
    template<class... sizes> 
    enable_if_t< 
    exactly_N_types< sizeof...(Sizes), sizes...>() 
    && can_all_convert_to< std::size_t, sizes...>() 
    ,NumType& 
    > 
    operator()(sizes... coords) 
    { 
     // Return reference to element at the position specified 
     // by coords. 
    } 
}; 

它過於冗長。我可以將exactly_N_types<?,?>替換爲sizeof...(Sizes)==sizeof...(sizes),這會減少批量,但我決定以僞概念的方式進行。

一旦我們有了概念,指定什麼...[N]意味着什麼會更少(因爲上面的大部分得到簡化),並且它也將更容易指定它的含義。兩者都是推遲...[N]的理由,直到概念出現在語言之後。 (另一方面,很多情況也是如此,最後一次我們可能試圖推遲概念的功能,這將是一個錯誤!)

隨着概念精簡版,它會看起來像這樣:

template <typename T, std::size_t... s> 
struct CTensor { 
    template<Sizes... sizes> requires exactly_N_types<sizeof...(s), Sizes...> 
    NumType& operator()(sizes... coords) 
    { 
     // Return reference to element at the position specified 
     // by coords. 
    } 
}; 

或某些情況。

4

莫里斯·布斯在拉珀斯維爾向進化小組提交了一份初稿,並且大力鼓勵他繼續進行投票。然後他在拉珀斯維爾郵寄郵件中正式提交了N4072,這意味着它將在10月份再次在Urbana舉辦。由於它是一個核心變化,如果它通過,它將成爲C++ 17的一部分,或者C++ 14之後的下一個版本的C++。

+2

你知道這是否有更新? Afaik沒有把它變成C++ 17,我根本找不到任何跟進提案。 – MikeMB