名称可以同时引用模板和值吗?

时间:2014-01-27 16:20:02

标签: c++

我希望能够使用表达时间量的表达式来调用wait函数,使用模板参数或函数参数来指定等待的时间量。 (为了增加乐趣:这些声明都在类模板中,因此不允许完全专门化。)我的偏好是

wait< ms< 10 >>();
wait( 10 * ms );

但我愿意接受

wait< ms< 10 >>();
wait( ms( 10 ));

我可以创建一个接受模板参数或函数参数的等待函数模板,但是对于参数我被卡住了。 MS&LT; 10>必须是类型,而不是内置类似的东西,如

template< int n >
struct ms {
   typedef void this_is_a_duration;
   constexpr int amount = n;
};

所以我可以为this_is_a_duration的存在编译时间'type-cheking'。但这似乎排除ms或ms()不是一种类型,对吧?当ms是一个类型时,似乎现在有办法使(10 * ms)成为一个有效的表达式? (如果允许的话,静态转换函数会这样做。)

我有什么方法可以制作ms&lt; 10&gt;是一个类型,ms或ms(10)是一个表达式?

2 个答案:

答案 0 :(得分:0)

不,在同一查找上下文中,名称只能是函数,变量或类型之一(包括每个的模板形式)。你想做什么是不可能的。

我建议的是两个中的一个的单字母命名空间:

wait<s::ms<10>>();

答案 1 :(得分:0)

这是我能想象的最接近的:

#include <iostream>

struct ms {
    unsigned value;
    ms(unsigned value)
    :   value(value)
    {}
};

template <unsigned N, typename Unit>
void wait()  {
    std::cout << "Template\n";
}

void wait(const ms&) {
    std::cout << "No Template\n";
}

int main() {
    wait<10, ms>();
    wait(ms(10));
    return 0;
}