是否有可能有这样的事情:
template<class T = unsigned = 64>
class X
{
};
基本上说如果没有指定任何内容,则unsigned应为类型,其值应为64。
答案 0 :(得分:4)
从字面上看,它没有意义。解释你想先做什么。
C ++中的模板有三种参数:1)类型参数,2)值(非类型)参数,3)模板参数。
当您将参数声明为class T
时,它是 type 参数(第一种)。它的“价值”实际上是类型。例如unsigned
。即T
的“值”为unsigned
。在unsigned
模板的实例化中,T
将替换为class X
。参数T
不能包含任何数值,例如64
。
然而,你似乎试图在第1类和第2类参数之间创建某种混合。首先,这是不可能的。其次,没有办法弄清楚它可能具有的语义含义。请澄清你的意图。
如果要传递数值,则必须创建第二种模板参数:值参数,如
template <unsigned N = 64>
class X {
};
因此,您需要首先确定您真正需要的模板参数类型:类型参数或值参数。或者两者都有。您尚未提供有关您的课程X
的任何详细信息,因此无法猜测您的目标是什么。
答案 1 :(得分:3)
不是真的。你可以做点接近的事情:
template < typename T = unsigned, T value = 64>
struct X{};
编辑:恍恍惚惚地读到你的另一个答案,如果你真的想要,你可以做些什么:
template < unsigned N = 64 >
struct unsigned_
{
typedef unsigned type;
enum { value = N };
};
// alternative versions...int, long, etc...
template < typename T = unsigned_<64> >
struct X {};
这为用户创造了更多的工作。你可以通过使用boost :: enable_if和is_fundamental解决其中一些问题,这样用户可以提供一个基本类型,而不会因为你正在寻找T :: type和T :: value而崩溃。
所以,虽然没有办法完全按照你的意愿去做...取决于你想要获得的丑陋程度,从用户的角度来看,你可能会非常接近。