不能使用std :: conditional来扣除模板参数类型

Blo*_*aRd 1 c++ type-traits

我想调用下面的函数模板

#include <iostream>
#include <type_traits>
#include <typeinfo>
using namespace std;

struct size1 { size1() {std::cout << "Caling 1 \n";}};
struct size2 { size2() {std::cout << "Caling 2 \n";}};

template <typename T, typename std::conditional_t<sizeof(T) == 4, size1, size2> U>
void afficher(T a)
{
    std::cout << typeid(U).name();
}


int main(int argc, char *argv[])
{
    afficher(10); //Error can't deduct U
}
Run Code Online (Sandbox Code Playgroud)

我认为在这里我有一个不可扣除的背景,我怎么能纠正它

在这里使用std :: condittional还是使用std :: enable_if?

谢谢.

jro*_*rok 5

你有一个语法问题,没有别的:

template <typename T, typename U = std::conditional_t<sizeof(T) == 4, size1, size2>>
void afficher(T a)         //  ^^^^
{
    std::cout << typeid(U).name();
}
Run Code Online (Sandbox Code Playgroud)

正如Jarod42在评论中所指出的,这允许用户绕过你的意图并对第二个参数做任何事情.您可以使用typedef代替:

template <typename T>
void afficher(T a)
{
    using U = std::conditional_t<sizeof(T) == 4, size1, size2>>;
    std::cout << typeid(U).name();
}
Run Code Online (Sandbox Code Playgroud)