gpt4 book ai didi

c++ - 作为模板参数 : if(T receive 2 param)T(a, b);否则 T(a);

转载 作者:太空狗 更新时间:2023-10-29 22:58:48 26 4
gpt4 key购买 nike

如何制作模板类Collection<K,T>接收函数 T - 可以有签名 T(K)T(K,int) - 作为模板参数,然后根据函数的签名有条件地编译?

这是可以接收 1 个签名的现有代码:Collection<K,HashFunction(K)> .

template<typename AA> using HashFunction= HashStruct& (*)(AA );
/** This class is currently used in so many places in codebase. */
template<class K,HashFunction<K> T> class Collection{
void testCase(){
K k=K();
HashStruct& hh= T(k); /*Collection1*/
//.... something complex ...
}
};

我希望它支持Collection<K,HashFunction(K,int)> .

template<class K,HashFunction<K> T /* ??? */> class Collection{
int indexHash=1245323;
void testCase(){
K k=K();
if(T receive 2 parameter){ // ???
HashStruct& hh=T(k,this->indexHash); /*Collection2*/ // ???
//^ This is the heart of what I really want to achieve.
//.... something complex (same) ...
}else{
HashStruct& hh=T(k); /*Collection1*/
//.... something complex (same) ...
}
}
};

我别无选择,只能创建 2 个不同的类:Collection1 & Collection2 ?
需要超过 c++11 的答案是可以的,但不太可取。

我觉得它可能可以通过使用“默认参数”技巧来解决。

最佳答案

可变参数模板、偏特化和 SFINAE 可以帮助您。

如果你接受复制 test() 方法,你可以做类似的事情

#include <iostream>

using HashStruct = std::size_t;

template<typename ... AA>
using HashFunction = HashStruct & (*)(AA ... );

HashStruct & hf1 (std::size_t s)
{ static HashStruct val {0U}; return val = s; }

HashStruct & hf2 (std::size_t s, int i)
{ static HashStruct val {0U}; return val = s + std::size_t(i); }

template <typename Tf, Tf F>
class Collection;

template <typename K, typename ... I, HashFunction<K, I...> F>
class Collection<HashFunction<K, I...>, F>
{
public:

template <std::size_t N = sizeof...(I)>
typename std::enable_if<N == 0U, void>::type test ()
{
K k=K();

HashStruct & hh = F(k);

std::cout << "case 0 (" << hh << ")" << std::endl;
}

template <std::size_t N = sizeof...(I)>
typename std::enable_if<N == 1U, void>::type test ()
{
K k=K();

HashStruct & hh = F(k, 100);

std::cout << "case 1 (" << hh << ")" << std::endl;
}
};

int main ()
{
Collection<HashFunction<std::size_t>, hf1> c1;
Collection<HashFunction<std::size_t, int>, hf2> c2;

c1.test(); // print "case 0 (0)"
c2.test(); // print "case 1 (100)"
}

但是,如果你可以将额外的参数传递给 test(),你就不需要 SFINAE,你可以创建一个单独的 test() 方法,一切都是更简单

#include <iostream>

using HashStruct = std::size_t;

template<typename ... AA>
using HashFunction = HashStruct & (*)(AA ... );

HashStruct & hf1 (std::size_t s)
{ static HashStruct val {0U}; return val = s; }

HashStruct & hf2 (std::size_t s, int i)
{ static HashStruct val {0U}; return val = s + std::size_t(i); }

template <typename Tf, Tf F>
class Collection;

template <typename K, typename ... I, HashFunction<K, I...> F>
class Collection<HashFunction<K, I...>, F>
{
public:
void test (I ... i)
{
K k=K();

HashStruct & hh = F(k, i...);

std::cout << hh << std::endl;
}
};

int main ()
{
Collection<HashFunction<std::size_t>, hf1> c1;
Collection<HashFunction<std::size_t, int>, hf2> c2;

c1.test(); // print "0"
c2.test(100); // print "100"
}

关于c++ - 作为模板参数 : if(T receive 2 param)T(a, b);否则 T(a);,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39507686/

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