类型取决于模板中的条件

时间:2017-05-05 16:21:37

标签: c++ c++11 templates

我可以使用参数创建模板函数,哪些类型取决于模板参数? (下面的代码只是为了解释,我想要的)

#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::conditional会有所帮助,但我想,我不知道如何正确使用它(下面的代码无法编译)

#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或更高版本的一些例子也是很好的经验。

谢谢=)

1 个答案:

答案 0 :(得分: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;
}