用于模板专用化的类似使用语句
Using-like statement for template specialization
>假设标头中有以下定义
namespace someNamespace {
template<class T, class S>
int operator + (const T & t, const S & s) {
return specialAdd (t, s);
}
}
现在我希望标题的用户能够做类似的事情
using someNamespace::operator + <OneClass,SecondClass>;
这显然是不可能的。
这样做的原因是我不希望我的运算符 + 干扰标准运算符 +,因此用户可以指定应该为哪些类型定义运算符 +。有没有办法实现这一目标?
使用巴顿-纳克曼技巧:http://en.wikipedia.org/wiki/Barton%E2%80%93Nackman_trick
template<typename T,typename S>
class AddEnabled{
friend int operator + (T const& t, const S & s) {
T temp(t);
return temp.add(s);
}
};
class MyClass: public AddEnabled<MyClass,int>{
public:
MyClass(int val):mVal(val){
}
int add(int s){
mVal+=s;
return mVal;
}
private:
int mVal;
};
这里再举一个重载<<运算符的例子:
template<typename T>
class OutEnabled {
public:
friend std::ostream& operator<<(std::ostream& out, T const& val) {
return static_cast<OutEnabled<T> const&>(val).ioprint(out);
}
protected:
template<typename U>
U& ioprint(U& out) const {
return static_cast<T const*>(this)->print(out);
}
};
要使用它,你可以让你的类继承自OutEnabled:
class MyClass: public OutEnabled<MyClass>{ ...
或者您可以定义一个哨兵对象,例如在 cpp 文件的匿名命名空间中
namespace{
OutEnabled<MyClass> sentry;
}
一旦模板 OutEnabled 被实例化(OutEnabled<MyClass>
),全局运算符就会std::ostream& operator<<(std::ostream& out, MyClass const& val)
存在。
进一步的MyClass必须包含一个函数(模板)匹配
template<typename U>
U& print(U& out) const {
out << mBottomLeft << "t"<< mW << "t"<< mH;
return out;
}
由于这是ioprint
.
函数U& ioprint(U& out)
不是绝对必要的,但是如果您没有在MyClass
中定义print
,它会为您提供更好的错误消息。
他们可以
专门化的类型特征类,并在运算符+中enable_if? 将运算符+放在全局命名空间中,但它返回
std::enable_if< for::bar<c1>::value && for::bar<c2>::value, int >
其中 bar 是命名空间中的模板类型特征类,如下所示:
template<class T>
struct bar: std::false_type {};
我认为这应该导致 sfinae 使您的模板加上仅匹配您专门接受的内容。
您可能希望将一些解构和引用剥离放入该enable_if中,并在运算符+中进行一些完美的转发。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 调用专用模板时出错"no matching function for call to [...]"
- 我的简单if-else语句是如何无法访问的代码
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 模板专用化(按容器):value_type
- 线程,如果else语句,都是错误的上下文切换后,会发生什么
- 为什么是0;C++中的有效语句
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 无法理解此 return 语句的功能,没有它就会发生运行时错误
- 我似乎对if/else的基本语句有问题:/
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 以在Qt中的IF语句中设置时间延迟
- 用于模板专用化的类似使用语句
- 以下语句是函数重载还是函数部分专用化