2012-02-24 108 views
10

让我们asssume,我们有一个模板funcion:是否可以将函数模板作为模板参数传递?

template<typename T1, typename T2, typename T3> 
T3 such_fun(T1 a, T2 b) { 
    // do something... 
} 

,现在我们想用它作为另一个模板参数,例如像那

template<typename T1, template<typename, typename, typename> some_function> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    // some code... 
} 

这可能吗?

我知道,我可以使用与自定义()操作一个结构。我只是对功能很好奇。

编辑:

当我在写这个问题,我的朋友发现的部分解决方案:

template<typename T1, T1 (*some_function)(T1, T1)> 
void big_fun(T1 a) { 
    // some code... 
    a = some_function(a, a); 
    // some code... 
} 

但还是 - 我很好奇,如果有可能没有一个功能型的前一个物化呼叫。例如 - 我可能想要调用各种类型组合通过的模板:

template<typename T1, typename T2, template<typename, typename, typename> some_function> 
void big_fun(T1 a, T2 b) { 
    // some code... 
    a = some_function<T1, T1, T1>(a, a); 
    a = some_function<T1, T2, T1>(a, b); 
    b = some_function<T2, T2, T2>(b, b); 
    b = some_function<T2, T1, T2>(b, a); 
    // some code... 
} 

回答

8

不,这是不可能的。从14.3.3在N3337:

模板参数的模板的模板参数应是一个类模板或别名模板的 名称,表示为 ID-表达。当模板参数命名为类模板时, 只有在将模板参数与相应参数匹配时才会考虑主类模板;即使其参数列表与模板模板参数的 相匹配,也不会考虑部分 专业化。

第一款只提到类模板明确。我想这也是不值得的麻烦,因为你可以做一些非常类似的功能或std::function作为论点。

+1

我不明白你在说什么的话.. -1,你能为我们提供的是不流利的standarese的ilustration? – lurscher 2012-02-24 17:58:33

+0

@lurscher,因为_you_不明白这是一个可怕的原因downvote。当量子物理学家谈论量子物理学时,我不会低估它,因为我不理解它。 – 2012-02-24 18:04:18

+0

@SethCarnegie,我不同意。我认为这本身就是一个很好的理由。此外,答案也是错误的;问题想要做什么是完全可能的,即使在C++ 03中也是如此。我认为SO的问题与pmr的回答之间存在脱节,因此存在倒退。如果他改善了他的回答,我会非常乐意撤回它 – lurscher 2012-02-24 18:19:40

1

C++中的模板在编译期间使用具体类型进行编译。他们必须知道。

这说你可以通过该参数可以推断出一个函数模板走得更远一点与你的部分解决方案。请注意,这与使用具体类型显式传递函数不同,您只需输入less即可。

template<typename T> 
T square(T a, T b) 
{ 
    return a * b; 
} 

template<typename T, T (*some_function)(T, T)> 
T test(T a) 
{ 
    return square (a, a); 
} 

void main() 
{ 
    int a = test<int, square>(2); 
    float b = test<float, square>(2.2f); 
} 
+0

我真的没有看到该代码和“部分解决方案”代码之间的区别。问题是,在这种方法中,不可能在不明确添加新模板参数的情况下使用各种类型的'some_function'。我很好奇,如果有更灵活的(但仍然没有类的使用)的方式。 – 2012-02-24 18:51:06

0

只要template< typename T1, typename T2, typename T3> someTemplate评估一些实际的类没有错误,你可以根据需要,并内其他模板尽可能多的组合使用。

你试过编译它吗?让我们看看你得到了什么错误(和混凝土样品)

+0

我知道我可以使用一个班级。我在我的文章中写道。问题是关于常见的功能。但根据@pmr写道 - 看起来语法上不可能。 – 2012-02-24 18:45:26

+0

@pmr嗯。好。我在示例中使用的语法部分是伪代码,即我知道我不能使用'class'关键字,所以我没有使用任何。这是关于这个想法。 – 2012-02-25 08:30:16

相关问题