gpt4 book ai didi

c++ - 相同模板参数的特化

转载 作者:搜寻专家 更新时间:2023-10-31 01:51:12 24 4
gpt4 key购买 nike

我有一个函数模板:

//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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com