2015-09-13 56 views
0

在viennacl库中,有一个叫C++:如何创建一个这样一个复杂类型的函数指针?

viennacl::linalg::element_tanh(some_vector) 

节省了大量的代码行的功能,我想引用该函数的函数指针。这是不容易的,因为你会看到阅读)element_tanh执行(当:

#define VIENNACL_MAKE_UNARY_ELEMENT_OP(funcname) \ 
template<typename T> \ 
viennacl::matrix_expression<const matrix_base<T>, const matrix_base<T>, op_element_unary<op_##funcname> > \ 
element_##funcname(matrix_base<T> const & A) \ 
{ \ 
    return viennacl::matrix_expression<const matrix_base<T>, const matrix_base<T>, op_element_unary<op_##funcname> >(A, A); \ 
} \ 
template<typename LHS, typename RHS, typename OP> \ 
viennacl::matrix_expression<const matrix_expression<const LHS, const RHS, OP>, \ 
          const matrix_expression<const LHS, const RHS, OP>, \ 
          op_element_unary<op_##funcname> > \ 
element_##funcname(matrix_expression<const LHS, const RHS, OP> const & proxy) \ 
{ \ 
    return viennacl::matrix_expression<const matrix_expression<const LHS, const RHS, OP>, \ 
            const matrix_expression<const LHS, const RHS, OP>, \ 
            op_element_unary<op_##funcname> >(proxy, proxy); \ 
} \ 

VIENNACL_MAKE_UNARY_ELEMENT_OP(abs) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(acos) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(asin) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(atan) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(ceil) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(cos) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(cosh) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(exp) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(fabs) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(floor) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(log) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(log10) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(sin) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(sinh) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(sqrt) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(tan) 
VIENNACL_MAKE_UNARY_ELEMENT_OP(tanh) 
#undef VIENNACL_MAKE_UNARY_ELEMENT_OP 

所以,类型这个功能可以使背部

viennacl::matrix_expression<const matrix_base<T>, const matrix_base<T>, op_element_unary<op_##funcname> >

如何创建一个函数指针如果第三个模板条目op_element_unary是#defined函数?

+1

请妥善格式化,它看起来像编写代码凌乱风格凌乱的问题格式结合。很难得到这个观点。 – luk32

+0

在C++看到这个声明的时候,第三个模板参数将是'op_tanh'。问题是什么? – rici

+0

另外,你的代码简化需要满足'使用viennacl :: linalg :: element_tanh'吗? – rici

回答

0

正如rici在评论中所说的那样,预处理器指令在评估“正常”代码之前已经被排除。对于所有意图和目的,当你看到VIENNACL_MAKE_UNARY_ELEMENT_OP(tanh)时,存在element_tanh函数。

我没有你的代码,所以我不能自己测试这个,但是这个声明应该创建一个指向element_tanh的第一个超载的模板类型的指针。

template <typename T> 
using PtrToTanh = viennacl::matrix_expression<const matrix_base<T>, const matrix_base<T>, op_element_unary<op_tanh>>(*)(matrix_base<T> const&) 

因为element_tanh是一个模板功能,可以直到你知道使用什么类型T创建一个指向它的指针。例如,int会的工作是这样的:

PtrToTanh<int> fptr = &viennacl::linalg::element_tanh<int>; 

如果你可以创建模板变量,你可以用它来使PtrToTanh类型的变量,你知道使用什么类型之前,但我的编译器不支持它:(我的猜测是它会是什么样子:

template <typename T> 
PtrToTanh<T> fptr = &viennacl::linalg::element_tanh<T>; 
//later 
fptr<int>(/*args*/); 

不要可以引用我这句话,虽然

+0

我已经试过了,但我应该明确表示该函数应该在运行时分配。所以,我这样做: template using activationPtr = viennacl::matrix_expression, const viennacl::matrix_base, viennacl::op_element_unary >(*)(viennacl::matrix_base const); 编译器显示以下错误: :使用“‘ 它必须与synthax做’错误预期不合格-ID之前”,但我不明白这一点。 – Philli

+0

在运行时分配?只要把这个任务放在一个程序运行过程中执行的程序段中? –

+0

我应该提供更多关于上下文的信息。我有一个代表人工神经网络(ANN)的类。在许多功能中,程序必须根据给定的参数决定如何处理,这会导致其他交换机内的大型交换机。随着任何新功能的使用,代码越来越难读。我只是想改变一个简单的函数指针的开关。因此,用户将神经元的输出激活函数配置为TANH或其他。在ANN类中,我想要有一个成员指出了必须应用于神经元的正确功能。 – Philli

相关问题