Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 推断模板参数_C++_Templates_Type Inference - Fatal编程技术网

C++ 推断模板参数

C++ 推断模板参数,c++,templates,type-inference,C++,Templates,Type Inference,我正在尝试编写一个函数模板,该模板可以推断出它的大多数参数,以用于一个简单的查找表 然而,我的努力始终会导致编译器错误。 以下是我迄今为止最好的尝试: // A simple templated struct that maps one key to one value template<typename KT, typename VT> struct LookupTable { KT key; VT value; }; // A lookup function t

我正在尝试编写一个函数模板,该模板可以推断出它的大多数参数,以用于一个简单的查找表

然而,我的努力始终会导致编译器错误。 以下是我迄今为止最好的尝试:

// A simple templated struct that maps one key to one value
template<typename KT, typename VT>
struct LookupTable
{
    KT key;
    VT value;
};

// A lookup function that searches an array for a match.
// returns NULL if key was not found.
// returns pointer to matching value when key is found.
//
// The first parameter is a Reference to an Array of T, with a specific size N
// In this example, the size is 12.
template<typename T, size_t N, typename KT, typename VT>
VT* Find(T<KT,VT> (&A)[N], KT key)   // <== Multiple Errors on this line
{
    VT* pFoundValue = NULL;
    for (size_t i = 0; i < N; ++i)
    {
        if (key == A[i].key)
        {
            pFoundValue = &(A[i].value);
            break;
        }
    }
    return pFoundValue;
}

// Test the function with a simple example
int main(void)
{
    LookupTable<std::string, int> calendar[] = {
        { "January",   31 },
        { "February",  28 },
        { "March",     31 },
        { "April",     30 },
        { "May",       31 },
        { "June",      30 },
        { "July",      31 },
        { "August",    31 },
        { "September", 30 },
        { "October",   31 },
        { "November",  30 },
        { "December",  31 }
    };

    const int* pDays = Find(calendar, std::string("May"));

    if (pDays == NULL)
    {
        cout << "Invalid Month" << endl;
    }
    else
    {
        cout << "The month of May has " << *pDays << " Days" << endl;
    }

    _getch();
    return 0;
}
实际上,我已经使所有参数都很容易从函数调用中推断出来。
我是否有一个语法错误丢失了?

template<typename T, size_t N, typename KT, typename VT>
VT* Find(T<KT,VT> (&A)[N], KT key)
在这方面:

template<typename T, size_t N, typename KT, typename VT>
VT* Find(T<KT,VT> (&A)[N], KT key)
而不是

template<typename T, size_t N, typename KT, typename VT>
VT* Find(T<KT,VT> (&A)[N], KT key)
模板
VT*查找(T&A)[N],KT键)
使用

模板
//^^^^^^^^^^^^^^^^^^^需要指出T是一个类模板
VT*查找(T&A)[N],KT键)
而不是

template<typename T, size_t N, typename KT, typename VT>
VT* Find(T<KT,VT> (&A)[N], KT key)
模板
VT*查找(T&A)[N],KT键)
使用

模板
//^^^^^^^^^^^^^^^^^^^需要指出T是一个类模板
VT*查找(T&A)[N],KT键)

这是一个更加紧凑、SFINAE友好的版本,可编译。注意,我声明了数组参数
const
,因为它不需要修改

#include <type_traits>

template<typename PairT,
         typename KeyT = decltype(std::declval<PairT>().key),
         typename ValueT = decltype(std::declval<PairT>().value),
         std::size_t N>
const ValueT *
Find(const PairT (&array)[N], KeyT key)
{
  for (auto& iter : array)
    if (key == iter.key)
      return &(iter.value);
  return nullptr;
}

这是一个更加紧凑、SFINAE友好的版本,可编译。注意,我声明了数组参数
const
,因为它不需要修改

#include <type_traits>

template<typename PairT,
         typename KeyT = decltype(std::declval<PairT>().key),
         typename ValueT = decltype(std::declval<PairT>().value),
         std::size_t N>
const ValueT *
Find(const PairT (&array)[N], KeyT key)
{
  for (auto& iter : array)
    if (key == iter.key)
      return &(iter.value);
  return nullptr;
}
请尝试以下格式:

 template<size_t N, typename KT, typename VT, template<typename, typename> class T>
模板
试试这种格式:

 template<size_t N, typename KT, typename VT, template<typename, typename> class T>
模板

T
用作模板参数,因此将其声明为一:模板类T
T
用作模板参数,因此将其声明为一:模板类T此语法至少编译。。。现在进行测试以验证。谢谢我最后的语法是:
template
。非常接近你所拥有的,但不完全如此。谢谢大家!@abelenky在那里使用
typename
class
没有区别。然而,
typename
确实与您的签名的其余部分更加一致。在
typename
class
之间仍然存在差异。如果我试图将
部分更改为
类型名
,则会出现编译器错误。最后的
实际上应该是
(而不是
结构
类型名
)@abelenky是的,我的“那里”没有足够的信息:)
typename
class
在引用类型模板参数时可以互换-
template class t
template class t
是一样的。但是,在C++17之前,您只能使用
class
引用模板参数(
T
)。因此,在此之前,
模板typename T
将失败。。。现在进行测试以验证。谢谢我最后的语法是:
template
。非常接近你所拥有的,但不完全如此。谢谢大家!@abelenky在那里使用
typename
class
没有区别。然而,
typename
确实与您的签名的其余部分更加一致。在
typename
class
之间仍然存在差异。如果我试图将
部分更改为
类型名
,则会出现编译器错误。最后的
实际上应该是
(而不是
结构
类型名
)@abelenky是的,我的“那里”没有足够的信息:)
typename
class
在引用类型模板参数时可以互换-
template class t
template class t
是一样的。但是,在C++17之前,您只能使用
class
引用模板参数(
T
)。所以,在那之前,
模板typename T
失败了。这正是我想要的。我不知道我能用C++做这件事,这正是我所要找的。不过我不知道我能用C++做。