2016-12-16 90 views
3

下面的示例代碼說明我的問題:如何專門用可變參數類模板

#include <array> 
#include <vector> 
#include <iostream> 
#include <type_traits> 

namespace Vector 
{ 
    namespace Intern 
    { 
     template <typename T1, typename ...T2> 
     struct Traits; 

     // How can I specialize here so that Memory is being assigned properly?? 
     template <typename T1, int N> 
     struct Traits<T1, int> { 
      static constexpr bool Static = 1; 
      using Memory = std::array<T1, N>; 
     }; 

     template <typename T1> 
     struct Traits<T1> { 
      static constexpr bool Static = 0; 
      using Memory = std::vector<T1>; 
     }; 
    } 

    template <typename T1, typename ...T2> 
    class Object 
    { 
     public : 
      void printd() 
      { 
       std::cout << "Is Static: " << Traits::Static << std::endl; 
      } 
     private: 
      using Traits = Intern::Traits<T1, T2...>; 
      using Memory = typename Traits::Memory; 

      Memory m_memory; 
    }; 

    template <typename T1, typename ...T2> 
    static auto Create(T2&& ...ln) -> decltype(auto) 
    { 
     return new Object<T1, T2...>(); 
    } 
} 

int main() 
{ 
    auto static_vector = Vector::Create<int>(10); 
    static_vector->printd(); 

    auto active_vector = Vector::Create<int>(); 
    active_vector->printd(); 
} 

我想知道我可以專注性狀結構,這樣的類型存儲器進行適當的分配爲標準::在上面的例子中,N設爲10。

+0

你想static_vector的類型是什麼呢? –

+0

你想如何在這裏推出'N'?爲什麼你需要一個可變模板而不是簡單的兩個參數? – Holt

回答

1

您不能直接使用整數,但可以將整數包裝爲一個類型。這可以使用例如 例如std::integral_constant

template <typename T1, typename T2, int N> 
struct Traits<T1, std::integral_constant<T2, N>> { 
    static constexpr bool Static = 1; 
    using Memory = std::array<T1, N>; 
}; 

template <typename T1> 
struct Traits<T1> { 
    static constexpr bool Static = 0; 
    using Memory = std::vector<T1>; 
}; 


auto static_vector = Vector::Create<int, std::integral_constant<int, 10>>(); 
+0

這接近我正在尋找的解決方案。然而,有沒有像你使用std :: integral_constant的方式,但不改變Vector :: Create函數的簽名?換句話說,是否可以通過擴展此代碼來實現,以便我可以保留Vector :: Create (10)簽名? – vixiv

+1

@vixiv我不這麼認爲。我不熟悉'constexpr'提供了什麼(不使用支持它的編譯器),但我猜測一旦你在函數參數land中,就不會返回模板參數。或者用戶定義的文字可能會有,但這會改變語法。 – Angew

1

保持簡單:

#include <array> 
#include <vector> 
#include <iostream> 
#include <type_traits> 

namespace Vector 
{ 
    struct VariableSize {}; 
    template<std::size_t N> struct FixedSize {}; 

    template<typename T, std::size_t N> 
    auto Create(FixedSize<N>) 
    { 
     return std::array<T, N>(); 
    } 

    template<typename T, std::size_t N> 
    auto Create(VariableSize) 
    { 
     return std::vector<T>(); 
    } 
} 

int main() 
{ 
    auto static_vector = Vector::Create<int>(Vector::FixedSize<10>()); 

    auto active_vector = Vector::Create<int>(Vector::VariableSize()); 
} 
+0

你的代碼確實很簡單。但事實是,我希望在一些後端代碼中重新設置因子(優化內存分配),而不必更改面向前端的Vector :: Create簽名。 – vixiv

+1

@vixiv恐怕這是不可能的。你不能通過改變它的參數來改變函數的返回值的類型。甚至沒有'constexpr'函數可以做到這一點。 –