如何使模板的所有实例成为类的朋友?

时间:2016-11-04 16:55:17

标签: c++ c++11 templates friend-function

我有一个类只能由一些工厂函数构建,而不是直接构建。

这些工厂函数都具有相同的名称,但是根据作为模板参数传递的枚举值进行区分(请参阅this answer中说明的第一种方法)。

这些功能的一个例子:

enum Tag {
    foo,
    bar,
    tag3
};

//declarations
template <Tag>
myClass Factory(int, char);

template <Tag>
myClass Factory(std::string, float);

//definitions
template <>
myClass Factory<foo>(int x, char y) {...}

template <>
myClass Factory<bar>(std::string x, float y) {...}

//as you can see, this way I can have functions with the same
//arguments that do different things with different tags:
template <>
myClass Factory<tag3>(int x, char y) {...}

如何让所有这些函数同时成为类的朋友,以便他们可以使用它的私有构造函数?

即。在上面的示例中,我希望同时拥有Factory<foo>Factory<bar>Factory<tag3>来访问myClass的私人会员,但我不想列出每个那些。我该怎么办?

1 个答案:

答案 0 :(得分:1)

为您的班级制作功能模板或班级模板的朋友:

template<class T>
class foo;

// forward declaration of the function. not really needed
template<class T>
void fun(T);

class myclass
{
private:
    int a;

    template<class T> friend class foo;
    template<class T> friend void fun(T); 
    // the above line declares foo<T>(T) to be friend of myclass
};

// the specializations definitions follow below
template<> void fun<int>(int i)
{
    myclass m;
    m.a = i; 
}

template<> void fun<char>(char c)
{
    myclass m;
    m.a = int(c);
}
// as you can see, they both can use the private members of myclass.