c++模板非类型形参的类型演绎



我正在努力做这项工作:

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,所以性感的东西是允许的。

c++ 0x引入了decltype(),这正是您想要的。

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

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

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

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

除此之外,我想你可以假设一下,像这样做:

template<size_t x>
void f() {
}
f<10>();

这两种方法都不是你想要的,但是一个好的编译器应该能够节省大量的编译时间,因为你传递的是一个常量。

你能详细说明你想要完成的任务吗?允许使用非整数类型吗?

你为什么不给我们展示一下你正在努力简化的更复杂的模板呢?

最新更新