2017-04-03 63 views
1

假设避免<>在C默认的模板类/结构++

template<class T> 
struct S{ 
    T x; 
    a(T xx){x=xx;} 
}; 

,而我们希望通过不仅仅是希望省略空尖括号默认专业化有利于缓和最常见的用途。人们可以达到的typedef

typedef S<int> defaut_S; 
default_S(1); 

但这里的一致性的方式中断了,如default_SS不同的名称,可能会导致用户混淆。更不用说它不适用于成员函数。

有没有更好的方法来实现这个目标?

+0

我不明白你在问什么。显然'default_S'与'S'有不同的名称,所以不清楚为什么你认为这个事实会导致混淆;成员函数也没有问题。 –

+1

C++ 17允许您从构造函数中推导出类模板参数。 – chris

+0

我想,上面的方法可能会导致混淆,因为我们有相同的类,这两个名称在概念上是相同的,这可能会导致混淆。也许有人认为他们来自不同的阶级。或者这是首选,因为你希望他们被视为单独的课程?不,成员职能没有问题,我错了。 – LeastSquaresWonderer

回答

1

使用实例化函数模式。

template <class T> 
struct S 
{ 
    T x; 
    void a(T xx) { x = xx; } 
}; 

template <class T=int> 
S<T> make_s() { return S<T>(); } 

int main() 
{ 
    auto s = make_s(); 
    auto t = make_s<double>(); 
}