我为自己做这个语法,因为我觉得以后会更方便。
temolate<typename U> struct identity{typedef U type;};
temolate<typename T, typename identity<T>::type value=0> struct my{
typedef std::vector<T> vec;
typedef std::array<T,value> arr;
typedef std::set<T> set;
// and so forth
};
我用它:
int main(){
my<int>::vec v; // okay
my<int,3>::arr a; // okay
// and so forth
}
但我也希望这样做:
我的)
template<??????????> // what should I do here?
struct my<?????????>{ // or may be here
typedef int i;
typedef float f;
typedef double d;
// and so forth;
}
所以我可以这样做:
int main(){
my::i a; // for int, what should I do?
my::f b; // for float, and
my::d c; // for double, and
// AND I ALSI CAN
my<int>::vec v; // already I know
my<int,3>::arr a; // and know
}
有可能吗?
我在这里看到:
Default template parameter partial specialization
在我问之前。所以我知道my<>::i
是可能的。
我也知道如何将别名与一起使用
我只是问有可能吗?而不是对我说 NO ,而是让我 downvote
答案 0 :(得分:4)
您可以将T
默认为特殊类型(此处为default_type
),然后专门针对它:
template<typename U> struct almost_identity{typedef U type;};
class default_type{};
template<> struct almost_identity<default_type>{ typedef int type; };
template<typename T = class default_type, typename almost_identity<T>::type value = 0> struct my{
typedef std::vector<T> vec;
typedef std::array<T,value> arr;
typedef std::set<T> set;
// and so forth
};
template<>
struct my<default_type, 0>
{
typedef int i;
typedef float f;
typedef double d;
};
这样您就可以使用my<>::i
。
如果你绝对希望my::i
和my<int>::vec
是正确的,那么据我所知,没有办法实现这一点。
答案 1 :(得分:1)
您愿意接受一个不同的名称,您可以使用使用声明来做类似的事情:
using myy = my<int>;
然后将您的类型称为:
myy::i