8

次のコードを検討してください。

#include <iostream>
#include <vector>
#include <type_traits>

// Version A
template<typename T>
void f(const T& x)
{
    std::cout<<"Version A"<<std::endl;
}

// Version B
template<template<typename> class T, typename T1>
void f(const T<T1>& x)
{
    std::cout<<"Version B"<<std::endl;
}

// Main
int main(int argc, char* argv[])
{
    f(double());
    f(std::vector<double>()); // <- How to force the use of version B ?
    return 0;
}

デフォルトでは、次のように生成されます。

Version A
Version A

Version B渡された型が適切な形状のテンプレートテンプレートである場合に使用を強制する方法(新しいバージョンをf追加しstd::enable_ifたり、その他のC ++ 11型特性構文を追加したりできますが、可能であればヘルパーを追加しないようにしますクラス) ?

4

2 に答える 2

11

std::vectortypenameパラメータは 1 つではなく、 2 つ必要です。アロケータを忘れないでください。

したがって、可変個引数テンプレートを使用します。

template<template<typename...> class T, typename T1>
void f(const T<T1>& x)
{
    std::cout<<"Version B"<<std::endl;
}

今ではあなたが望むように動作します。

于 2012-12-17T08:06:51.023 に答える
1

Pubby が彼の回答で説明したように、std::vector は 2 つのパラメーターを持つテンプレートであるため、オーバーロード関数はより多くのテンプレート パラメーターを受け取る必要があります。可変個引数テンプレートを使用したくない場合は、正しい数のパラメーターを設定する必要があります。

#include <iostream>
#include <vector>
#include <type_traits>


// Version A
template<typename T>
void f(const T& )
{
    std::cout<<"Version A"<<std::endl;
}

// Version B
template<template<typename,typename> class T, typename T1,typename T2>
void f(const T<T1,T2>& )
{
    std::cout<<"Version B"<<std::endl;
}

template<typename T>
void baa(const T&)
{
}

// Main
int main()
{
    f( double() );
    f( std::vector<double>() ); // <- How to force the use of version B ?
}
于 2012-12-17T08:24:48.287 に答える