2017-05-05 33 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