2014-11-23 54 views
1

一個仿函數模板類,需要注意以下已簡化如何調用與模板函數

#include <type_traits> 

template <class FuncT, class FuncArgT> 
class UnaryFunctor 
{ 
    FuncT func; 

public: 
    UnaryFunctor(FuncT const& func) : func(func) {} 

    template <class ArgsT> struct result {}; 

    template <class F, class ArgT> 
    struct result < F(ArgT) > 
    { 
     typedef typename std::result_of<FuncT(ArgT)>::type type; 
    }; 

    template <class ArgT> 
    typename result<UnaryFunctor(ArgT)>::type 
     inline operator()(ArgT const& arg) const 
    { 
     return func(arg); 
    } 
}; 

template <class FuncT, class ArgT> 
struct Result 
{ 
    typedef typename std::result_of<UnaryFunctor<FuncT, ArgT>(ArgT)>::type type; 
}; 

template <class FuncT, class ArgT> 
typename Result<FuncT, ArgT>::type 
inline unary_apply(FuncT const& func, ArgT const& arg) 
{ 
    return UnaryFunctor<FuncT, ArgT>(func)(arg); 
} 

所以基本上的目的是調用與正在通過的值的函數一元仿函數的代碼。 可以說我們有以下兩個簡單的功能。

template <class T> T addValueTemplate(T const& val) { return val + 3; } 
unsigned int addValue2(unsigned int const& val) { return val + 3; } 

調用,這是好的

unsigned int i = 1, j; 
j = unary_apply(&addValue2, i); 

,但我不能工作,如何做同樣的事情,但對於模板類addValueTemplate。例如,這不會編譯

j = unary_apply(&addValueTemplate<unsigned int>, i); 

有沒有辦法做到這一點? 這在編譯的方式GCC不錯,但不是MSVC

+0

*這不會編譯*,你得到什麼錯誤? – 2014-11-23 08:51:18

+0

它編譯於GCC很好,但不是在MSVC所以我螺母知道什麼問題是 – xerion 2014-11-23 08:52:33

+0

,如果這是具體的編譯器錯誤,那麼(1)。給出確切的編譯器版本,(2)。給出確切的錯誤信息 – 2014-11-23 08:53:14

回答

1

看起來像MSVC的錯誤。它認爲&addValueTemplate<unsigned int>是一個函數,而不是一個函數指針。使用一箇中間的函數指針變量:

unsigned int (*av)(unsigned int const&) = &addValueTemplate; 
j = unary_apply(av, i); 

或者使用該欺騙MSVC:

template <typename T> 
T* identity(T* x) { return x; } 

j = unary_apply(identity(&addValueTemplate<unsigned int>),i); 

(出於完整性,過載identity爲常量/非const/rvalue引用/指針)