2017-05-05 55 views
0

我可以使用參數創建模板函數,哪些類型取決於模板參數? (下面的代碼只是解釋,我想要什麼)類型取決於模板中的條件

#include <complex> 

template <bool two> 
void foo((if (two) ? double* : std::complex<double>* >) input, size_t n) 
{ 
    for (size_t i = 0; i < n; ++n) 
     input[i] *= two ? 2.0 : 1.0; 
} 

void foo_double(double *input, size_t n){ 
    foo<true>(input,n); 

} 

void foo_complex (std::complex<double> *input, size_t n){ 
    foo<false>(input,n); 
} 

我想std::condition會有所幫助,但我想,我不知道如何正確地在這裏(下面的代碼不能編譯)

使用
#include <type_traits> 
#include <complex> 

template <bool two> 
void foo(std::conditional<two, double*, std::complex<double>* > input, size_t n) 
{ 
    for (size_t i = 0; i < n; ++n) 
     input[i] *= two ? 2.0 : 1.0; 
} 

void foo_double(double *input, size_t n){ 
    foo<true>(input,n); 

} 

void foo_complex (std::complex<double> *input, size_t n){ 
    foo<false>(input,n); 
} 

這將是非常好的,如果有人找到解決方案,而不是C++ 11高,所以我將能夠編譯它無論是在vs2012和使用gcc-6 +。但是一些使用C++ 14或更高版本的例子也是很好的體驗。

感謝=)

+4

爲什麼你需要,甚至做到這一點?爲什麼不'template void foo(T input,size_t n){...}'? – NathanOliver

+0

'std :: conditional'是正確的選擇。你看過[docs](http://en.cppreference.com/w/cpp/types/conditional)看看如何使用它?如果您無法訪問C++ 11,則應該可以自己實現它(如果需要幫助,可以將其記錄下來)。 – Rakete1111

+0

使用'std :: conditional'就像這樣:'std :: conditional :: type' – qxz

回答

2

你只需要添加一個::typetypename

template <bool two> 
// ......*typename*.....................................................*::type* 
void foo (typename std::conditional<two, double*, std::complex<double>* >::type input, size_t n) 
{ 
    for (size_t i = 0; i < n; ++n) 
     input[i] *= two ? 2.0 : 1.0; 
} 
+0

謝謝!有用!我將在時間限制= = – Sklert

+0

@Sklert在C++ 14中標記此答案,您可以改爲將代碼更改爲'std :: conditional_t',而不添加'typename'和':: type'。 – Yakk