3

我想foo通过使用 atypedef来表示ptr参数的类型来简化。

#include <iostream>

template <unsigned N>
int foo (int (*ptr) (const char (*)[N])) {
    char good[N] = "good";
    return ptr(&good);
}

int bar (const char (*x)[5]) {
    std::cout << *x << "\n";
    return 0;
}

int main ()
{
    return foo(bar);
}

我想写得foo()更像这样:

template <unsigned N>
int foo (FUNCTION_TYPE *ptr) {
    char good[N] = "good";
    return ptr(&good);
}

我尝试使用辅助类之类的特征,但失败了有没有合适的方法来创建一个 typedef for FUNCTION_TYPE

4

4 回答 4

3

using在 C++11 中,您可以通过使用关键字获得模板 typedef 的大致等价物。这仍然允许N从论点中推导出来:

template <unsigned N>
using fooP = int (*) (const char (*)[N]);

template <unsigned N>
int foo (fooP<N> ptr) {
  return ptr(0);
}

int bar(const char (*p)[2]) {
  return 0;
}

int main() {
  return foo(bar);
}
于 2013-06-10T22:14:26.270 回答
1

所以你的基本问题是在函数调用中没有推断出依赖类型。

假设您想N在消除混乱的同时推断值,您需要的是从函数类型映射到值的能力N

template<typename Func>
struct get_N {};
template<unsigned int N>
struct get_N< int( const char(*)[N] ) > {
  typedef std::integral_constant< unsigned int, N > type;
};
template<typename Func>
using getN = typename get_N<Func>::type;

一旦你有了这个,你可以在template类型参数中使用它:

template <typename Func, typename Nt = getN<Func>>
int foo (Func* ptr) {
  constexpr N = Nt::value;
  return ptr(&"good");
}

我们可以访问Ninside foo,唯一可以匹配的东西(除了一些花哨的步法)是可以理解foo的东西get_N(通过 SFINAE)。

于 2013-06-10T22:10:53.313 回答
1

Yes, you can use a default template argument:

template <unsigned N, typename T = int (*) (const char (*)[N])>
int foo (T ptr);

Here is a compiling demo.

Another option is to use std::function:

#include <functional>
#include <string>

int foo(std::function<int(std::string)>& ptr)
{
    // ...
}
于 2013-06-10T21:57:44.563 回答
1

其实你可以把它做成模板

template<unsigned N, typename Func) 
int foo(Func func){ return func("good"); }

int bar(const std::string& str){ return str == "good"; }

int main(){    const int r = foo(bar); }

这样,您不仅可以传递常规函数,还可以传递函子

于 2013-06-10T22:01:03.107 回答