C ++模板非类型参数类型推导

时间:2011-07-18 18:14:06

标签: c++ templates c++11 metaprogramming

我正在尝试做这项工作:

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    f<10>();    // implicit deduction of [ T = int ] ??
    return (0);
}

目的是简化更复杂的模板。

经过多次搜索后,我在C ++ 0x上找不到任何方法,所以stackoverflow是我最后的选择。

  • 未指定所有类型的T ......
  • 我在g ++ C ++ 0x上,所以允许性感的东西。

3 个答案:

答案 0 :(得分:5)

C ++ 0x引入了decltype(),它完全符合您的要求。

int main()
{
  f<decltype(10), 10>(); // will become f<int, 10>();
  return 0;
}

答案 1 :(得分:5)

C ++中的结构/类没有自动模板推导。你可以做的就是这样(警告,未经测试!):

#define F(value) f<decltype(value), value>

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    F(10)();
    return (0);
}

它不像模板专用代码那样干净,但它清楚它的作用,让你避免重复自己的负担。如果需要它在非C ++ 0x编译器上工作,可以使用Boost.Typeof而不是decltype。

答案 2 :(得分:2)

我认为你不能这样做,你只需要让编译器知道那里有一个类型。我能想到的最接近的事情是:

template <class T>
void f(T x) {
    // do something with x
}

f(10);

除此之外,我想你可以假设一点并做这样的事情:

template<size_t x>
void f() {

}

f<10>();

这两者都不是你想要的,但是一个不错的编译器应该能够在你传递常量的情况下完成很多编译时间。

你能详细说明你想要完成的事情吗?是否允许使用非整数类型?为什么不向我们展示您想要简化的更复杂的模板。