作者热门文章
- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个函数模板:
//the most generalized template
template<typename typeArg, typename typeRet>
typeRet func(const typeArg &val);
和它的几个特化,看起来像:
template<>
someType func(const otherType &val)
{
//code
}
template<>
typeFoo func(const typeBar &val)
{
//more code
}
但它没有默认实现。
显然,这两种类型都不能自动推导出来,所以调用看起来像:
type1 var1 = func<argType,type1>(arg);
仅针对类型相同的情况编写默认实现的正确方法是什么?
我尝试了一些变体:
第一次尝试
template<typename theOnlyType, theOnlyType>
theOnlyType func(const typeArg &theOnlyType)
{
//code
}
但这是错误的,因为这个函数只有一个模板参数,它不对应上面的调用。
第二次尝试
template<typename type1, typename type2>
type1 func(const type1 &theOnlyType)
{
//code
}
调用变得不明确,候选者是这个函数和第一个代码块中最通用的模板。
最佳答案
经过一些研究,我想出了一个明显更好的解决方案。它涉及在静态方法周围添加一个包装类并通过全局方法分派(dispatch)它们:
#include <iostream>
namespace tag
{
template <typename U, typename P>
struct wrapper // default implementation
{
static U foo(P const &)
{
std::cout << "different types";
return U();
}
};
}
namespace tag
{
template <typename T>
struct wrapper<T, T> // specialized
{
static T foo(T const &)
{
std::cout << "same type";
return T();
}
};
}
template <typename U, typename P>
static inline U foo(P const &p)
{
return tag::wrapper<U, P>::foo(p);
}
int main()
{
foo<int>(0);
foo<int>(true);
}
希望对您有所帮助。
使用
std::enable_if
与
std::is_same
(C++11):
template <typename A, typename B, typename =
typename std::enable_if<std::is_same<A, B>::value>::type>
B foo(const A &) {
}
或将此版本用于 C++03 及更早版本:
template <typename A, typename B> struct foo; // implement for different types
template <typename T> struct foo<T, T> {
T operator()(const T &) {
// default impelentation
}
};
int main() {
foo<int, int> f;
int n;
f( n );
}
我相信有办法改善这一点。我尝试对该函数使用部分特化,但我无法让它为我工作。
关于c++ - 相同模板参数的特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14058636/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!